Mi a parancshelyettesítés egy héjban? [duplicate]

Erre a kérdésre már itt vannak válaszok :

Megjegyzések

  • Rendben, mindenkinek el kell lazulnia és le kell állítania egymást trollkodással vádolni. Ha nem tetszik egy kérdésnek ', akkor szavazzon le vagy hagyja figyelmen kívül és menjen el . Ha úgy érzi, hogy ' megtámadják hozzászólásokban, akkor ne vegyen részt, hanem jelölje meg a -t és menjen el .
  • Szintén kapcsolódó: Mi ' különbség a $ (stuff) és a `stuff között?
  • A parancs kicserélése és a echo parancs kimenete rossz példa a parancs behelyettesítésére, mert 1) a kimenetet mindenképpen megjelenítették volna, 2) printf biztonságosabb a változó adatokhoz. A példa is megírható date | sed 's/^/Today is /'
  • @Kusalananda Úgy látom, hogy azonnal kinyomtatja (printf ) haszontalan. Kicsit megváltoztattam a megfogalmazást, azonnal: sometime later, vonzóbb?
  • A példa lehet thedate=$(date), majd printf 'The date is %s\n' "$thedate".

Válasz

" A parancs behelyettesítése " a shell nyelv azon funkciójának neve, amely lehetővé teszi a parancs végrehajtását és a parancs kimenetének cseréjét ( helyett) a parancs szövege.

A shell nyelvnek nincs más olyan funkciója, amely lehetővé tenné ezt.

Parancs behelyettesítés, azaz az egész kifejezést helyettesíti a kimenete, amely a parancshelyettesítések elsődleges használata.

A parancs, amelyet a parancs helyettesít végrehajt, egy alhéj, ami azt jelenti, hogy saját környezete van, amely nem fogja befolyásolni a szülőhéj környezetét.

Nem minden alhéj végrehajtás parancscsere ugh (lásd a további példákat a végén).

Példa arra, hogy a parancs helyettesítése alhéjban kerül végrehajtásra:

$ s=123 $ echo "hello $( s=world; echo "$s" )" hello world $ echo "$s" 123 

Itt a Az s változó az 123 karakterláncra van állítva. A következő sorban a echo parancs meghívásra kerül egy stringen, amely a parancs behelyettesítésének eredményét tartalmazza. A parancscsere a s értéket a world karakterláncra állítja, és visszhangozza ezt a karakterláncot. A world karakterlánc a parancs kimenete a parancs behelyettesítésében , és így, ha ezt a set -x, azt látnánk, hogy a fenti második sor kibővült echo "hello world" -re, amely hello world -et produkál a terminálon:

$ set -x $ echo "hello $( s=world; echo "$s" )" ++ s=world ++ echo world + echo "hello world" hello world 

(bash a + további szinteket ad hozzá a egy parancshelyettesítő alhéj a nyomkövetési kimenetben, más héjak ezt nem tehetik meg)

Végül megmutatjuk, hogy a parancs behelyettesítésén belüli parancs a saját alhéjában futott, mert nem befolyásolta a s a hívó shellben (az s értéke továbbra is 123, nem pedig world).

Vannak más helyzetek is, amikor a parancsokat alhéjakban hajtják végre, például a

echo "hello" | read message 

In bash, hacsak nem állítja be a lastpipe beállítást (csak nem interaktív példányokban), a read alhéjban fut, ami azt jelenti hogy a $message nem változik meg a szülőhéjban, vagyis echo "$message" műveletet hajt végre, miután a fenti parancs visszahangol egy üres karakterláncot (vagy bármilyen értéket $message korábban volt).

A folyamat helyettesítése a bash fájlban szintén végrehajt egy alhéjban:

cat < <( echo "hello world" ) 

Ez is különbözik a parancs helyettesítésétől.

Megjegyzések

  • A 4.2-es verzióhoz felfelé, ha shopt lastpipe be van állítva, a jobvezérlés nem aktív, és a folyamat nem háttérképes, az utolsó parancs nem fut alhéjban.
  • Azt mondod: “A shell nyelvnek nincs más olyan jellemzője, amely lehetővé tenné ezt.” Nos, a szőrszálak hasadásának kockázatával megteheti a következőt: cmd₁ > myfile / read -r var < myfile / cmd₂ "$var" . Szükség esetén kibővítheti ezt a többsoros adatok kezeléséhez.
  • @ G-Man Igen, és kiírhat egy új shell parancsfájlt is egy fájlba, és ezt végrehajthatja.Nincs még egy olyan funkció, amely lehetővé tenné a szöveg egy darabjának helyettesítését a parancs kimenetével.

Válasz

A

a=$(command) 

a command eredményértékét a változóba fogja tárolni.

Valójában nincs több.

Megjegyzem, hogy:

a=`command` 

elavult, és a ugyanaz, mint a fentiekben.

Megjegyzések

  • eredmény itt a parancs normál kimenete, amelytől minden új sor el van távolítva karakterek (és néhány változat a héjak között, ha a kimenet nem szöveges). Ne feledje, hogy a `...` a csh szintaxis Bourne-je, míg az $(...) a Korn / POSIX szintaxis (`...` továbbra is támogatott a visszamenőleges kompatibilitás érdekében)
  • @St é phaneChazelas Köszönjük az értékes információkat, és nyugodtan szerkesztheti a választ, hogy az benne legyen.

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