Megjegyzések
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.
echoparancs kimenete rossz példa a parancs behelyettesítésére, mert 1) a kimenetet mindenképpen megjelenítették volna, 2)printfbiztonságosabb a változó adatokhoz. A példa is megírhatódate | sed 's/^/Today is /'printf) haszontalan. Kicsit megváltoztattam a megfogalmazást, azonnal:sometime later, vonzóbb?thedate=$(date), majdprintf 'The date is %s\n' "$thedate".