eval vs. pipe keresztül bash

Mi a különbség a használat között:

eval "echo "foo"" 

és

echo "echo "foo"" | bash 

van ilyen?

Megjegyzések

  • Itt ' egy másik variáció, a végrehajtási környezetekhez képest kissé eltérő viselkedéssel: ( eval 'echo "foo"' )

Válasz

Rövid válasz

A eval által futtatott parancsot az aktuális héjban hajtják végre, a bash -re irányított parancsot pedig egy alhéjban hajtják végre, például:

> echo "x=42" | bash; echo $x > eval "x=42"; echo $x 42 

hosszabb válasz

A megjegyzésekben azt állították, hogy a bash (> = 4.2) az első parancsnak is ugyanez a hatása lehet. Úgy tűnik azonban, hogy nem ez a helyzet.

Valójában néhány tényező miatt a piped parancs nem fut az aktuális munkamenetben: a pipe és a bash parancs.

A piped parancsok többnyire alhéjakban futnak. A Bash kézikönyv ( 3.2.2. Szakasz: Csővezetékek ) a következőket mondja:

A folyamat minden egyes parancsát a saját alhéjában hajtják végre (lásd: Parancsfuttatási környezet ).

Amint a megjegyzésekben rámutattunk, ez a viselkedés a lastpipe opcióval módosítható. A Bash Manual ( 4.3.2. Szakasz: A Shopt beépítése ) a következőket mondja el a lastpipe opcióról:

lastpipe

Ha be van állítva, és a jobvezérlés nem aktív, a shell lefuttatja egy olyan folyamat utolsó parancsát, amelyet nem hajtottak végre a háttér az aktuális shell környezetben.

Az alábbiak szerint ellenőrizhetjük, hogy ez a helyzet.

Először engedélyezze a lastpipe:

> shopt -s lastpipe 

Ezután tiltsa le a job-vezérlést:

> set +m 

Most hajtson végre egy parancsot, amely egy változót állít be egy csövön belül:

> unset x > echo x=42 | while IFS= read -r line; do eval "${line}"; done; > echo $x 42 

Figyelje meg, hogy a while loop és a read parancs megkerülő megoldás, mivel a eval parancs nem tudja beolvasni a bemenetet a stdin-ből (ezért a egy pipa).

Ez a példa azt bizonyítja, hogy a csőben a jobb szélső parancs valóban megtörténhet , az aktuális héjban kell végrehajtani. Ez azonban valójában nem befolyásolja eredeti példánkat. Még akkor is, ha lastpipe engedélyezve van és a feladat-ellenőrzés le van tiltva, akkor is a következő eredményt kapjuk, amikor a bash -hez vezetünk:

> echo "x=42" | bash; echo $x > 

Ez azért van, mert a bash parancs maga hajtja végre a bemenetet egy alhéjban.

Megjegyzések

  • ez egy jó megfigyelés, nem értettem ' erre, de igen, azt hiszem, hogy ' s hogyan működnek a pipák
  • Csak kíváncsi, mi az oka annak, hogy nem fogadta el a választ?
  • A bash 4.2+ verzióhoz egy szkript futtatásakor (vagy pontosabban, ha a jobcontrol ki van kapcsolva) és a shopt lastpipe be van állítva, és a csővezeték nincs háttérrel, a cső jobb oldali végét a ' tetején ' shell nem alhéj. Lásd: unix.stackexchange.com/questions/9954/… és unix.stackexchange.com/questions/136206/readarray-or-pipe-issue
  • @ dave_thompson_085 A bash parancs futtatható a felső héj az opcióktól függően, de az x=42 minden bizonnyal valamiben fut, amelyet ésszerűen alhéjnak lehet nevezni.
  • @AlexanderMills Valójában a cső nem ' t az egyetlen kérdés. A bash parancs egy alhéjban hajtja végre a bemenetet, függetlenül attól, hogy egy csőről van szó. További részletekért lásd a megoldásom frissítését.

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