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
ö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″>
.
&
villa, ott ' nincs exec. A Fork + exec az, amikor elindít egy külső parancsot.exec
, de a két nyelvnek eltérő a vezérlési folyamata.&
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.