Támogatja-e a bash a C ' s villához () hasonló villát?

Van egy szkriptem, amelyet szeretnék egy ponton elágazni, így ugyanazon szkript két példánya fut.

Például , Szeretném, ha a következő bash szkript létezne:

echo $$ do_fork() echo $$ 

Ha ez a bash szkript valóban létezik, akkor a várt kimenet a következő lesz:

<ProcessA PID> <ProcessB PID> <ProcessA PID> 

vagy

<ProcessA PID> <ProcessA PID> <ProcessB PID> 

Van valami, amit elhelyezhetek a “do_fork ()” helyett, hogy ezt megszerezzem típusú kimenetet, vagy a bash szkriptet C-szerű villára készteti?

Válasz

Igen. Az elágazás meg van írva &:

echo child & echo parent 

Az zavaró lehet, hogy $$ nem a shell folyamat PID-je, hanem az eredeti shell folyamat PID-je. Ennek az a lényege, hogy $$ a shell parancsfájl egy adott példányának egyedi azonosítója: nem változik a parancsfájl végrehajtása során, és különbözik a $$ stől bármely más, egyidejűleg futó programban forgatókönyv. A shell folyamat tényleges PID-jének megszerzésének egyik módja sh -c "echo $PPID".

A shellben lévő vezérlőáram nem azonos C-vel. Ha a C “d write

first(); fork(); second(); third(); 

akkor a héj megfelelője

after_fork () { second; third; } first; after_fork & after_fork 

Az egyszerű shell forma A first; child & parent megfelel a szokásos C idiómának

first(); if (fork()) parent(); else child(); 

& és $$ minden Bourne-stílusú héjban létezik és így viselkedik, és a (t) csh-ben. $PPID nem létezett a Bourne-i orignálban shell-ben van, de POSIX-ban van (tehát hamu, bash, ksh, zsh stb.).

Megjegyzések

  • De ez a ' s alapvetően " villa + exec ", nem csak villa.
  • @mattdm: Uh? & villa, ott ' nincs exec. A Fork + exec az, amikor elindít egy külső parancsot.
  • @mattdm: Ah, azt hiszem, látom mit Cory egyre közelebb kerül. ' nincs exec, de a két nyelvnek eltérő a vezérlési folyamata.
  • @Gilles: A bash & vezérlő operátor elindít egy alhéjat, amelyben az adott parancsot végrehajtják. Villa + exec. ' t egyszerűen beírhatja a & parancsot anélkül, hogy a végrehajtáshoz elõzõ parancsot adna.
  • Nos, ha " Az elágazás be van írva >

önmagában egy vonalon. De ' t megteheti. Ez nem ' nem jelenti az " villát itt ". Ez azt jelenti, hogy " végrehajtja az előző parancsot a háttérben egy alhéjban ".

Válasz

Igen, alhéjaknak hívják . A zárójelben található héjkód egy alhéj (villa). Az első héj azonban általában megvárja, amíg a gyermek befejeződik. A & terminátor segítségével aszinkronvá teheti. Lásd a következő műveletek során:

#!/bin/bash (sleep 2; echo "subsh 1")& echo "topsh" 

$ bash subsh.sh

Megjegyzések

  • A zárójelek alhéjat hoznak létre , de ez az ' s villa + várakozás. & csak villa. Ha egynél több csővezetéket akar végrehajtani a gyermekfolyamatban, ' elegendő ahhoz, hogy zárójeleket használjon (amelyek csoportosítást végeznek gyermekfolyamat létrehozása nélkül): { sleep 2; echo child; } &

Válasz

Nincs bennszülött bash (vagy tudomásom szerint bármely más tipikus * nix shell) ennek a módja. Sokféle módon lehet olyan villás folyamatokat létrehozni, amelyek aszinkron módon mást csinálnak, de nem hiszem, hogy bármi lenne, ami a fork () rendszerhívás pontos szemantikáját követi.

A tipikus megközelítés hogy a legfelső szintű szkripted hozzásegíthesse azokat a segítőket, akik csak azt a munkát végezik, amelyet el akarsz osztani. Ha $0 $@ & vagy bármi mást csinálsz, akkor az elején kezded újra, és ezt valahogy kitalálni.

Valójában több okos módszerre gondolok, amelyek segítségével ezt megteheti ….

De , mielőtt az agyam túlságosan belemerülne, szerintem nagyon jó szabály: ha megpróbálsz héjba írni valamit, és ez egyre tele okos trükkökkel, és több nyelvi funkcióra vágyik, ideje váltani egy igazi programozási nyelvre .

Megjegyzések

  • Noha a te álláspontod jól elfogadott, a bash ' szintaxisa vitathatatlanul nehéz, és ez ' hiányzik a Perl vagy a Python elegánsabb adatstruktúrája és jellemzői, a bash ugyanolyan valóságos, mint amilyenné válik- a tartományában . Ez egy tartományspecifikus nyelv, és még jobban érvelnék (tömörebb, egyszerűbb), mint pl. A Python sok esetben. Feladhat-e egy szobányi rendszert és nem ismeri a Pythont? Igen. Meg tudja csinálni, és nem ismeri a bash [programozás] nyalását? Nem szeretnék ' kipróbálni. 30 év shell programozás után azt mondom, hogy ' olyan valóságos, amennyire csak lehet. És igen, beszélek Python-nal. De ne tévessze meg a fiatalokat.
  • id = “fdbe01cc07″>

.

  • Ez azt jelenti, hogy technikailag nekem jobban tetszik ez a válasz. Ha azt mondjuk, hogy " & ", az a válasz a kérdés, " villa egy ponton, tehát ugyanazon szkript két példánya fut " elme zavaros. Amit " & " a bash kézikönyv szerint " … végrehajtja a [megadott] parancsot a háttérben egy alhéjban. " Meg kell szakítania a parancsot, és villát is tartalmaz (technikailag) , Linux alatt egy klón ()), de ekkor ugyanazon szkript két példánya nem fut.
  • Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük