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.
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 /'
printf
) haszontalan. Kicsit megváltoztattam a megfogalmazást, azonnal:sometime later
, vonzóbb?thedate=$(date)
, majdprintf 'The date is %s\n' "$thedate"
.