Mitä eroa on käyttää:
eval "echo "foo""
ja
echo "echo "foo"" | bash
onko niitä?
Kommentit
vastaus
lyhyt vastaus
eval
: n suorittama komento suoritetaan nykyisessä kuoressa ja komento, johon putki lähetetään bash
, suoritetaan alikuoressa, esim .:
> echo "x=42" | bash; echo $x > eval "x=42"; echo $x 42
Pidempi vastaus
Kommenteissa väitettiin, että bash
(> = 4.2) ensimmäisellä komennolla voi myös olla sama vaikutus. Näin ei kuitenkaan näytä olevan.
On olemassa muutama tekijä, jotka eivät johda komentokomennon suorittamiseen nykyisessä istunnossa: putki ja bash
-komento.
Suurimmaksi osaksi putkikomennot suoritetaan alikuorissa. Bash-käsikirjassa ( Osa 3.2.2: Putkilinjat ) on sanottava seuraava:
Jokainen putkilinjan komento suoritetaan omassa alikuoressaan (katso komentojen suoritusympäristö ).
Kuten kommenteissa todettiin, tätä käyttäytymistä voidaan muuttaa lastpipe
-vaihtoehdon avulla. Bash-käsikirjassa ( Luku 4.3.2: Shopt-sisäänrakennus ) on seuraava sanottava vaihtoehdosta lastpipe
:
lastpipe
Jos asetettu ja työn hallinta ei ole aktiivinen, komentotulkki suorittaa viimeisen komennon putkistosta, jota ei ole suoritettu taustaa nykyisessä kuoriympäristössä.
Voimme varmistaa, että näin on, seuraavasti.
Ota ensin käyttöön lastpipe
:
> shopt -s lastpipe
Poista sitten työn hallinta käytöstä:
> set +m
Suorita nyt komento, joka asettaa muuttujan putken sisältä:
> unset x > echo x=42 | while IFS= read -r line; do eval "${line}"; done; > echo $x 42
Huomaa, että käytämme while
loop ja read
-komento kiertotapana, koska eval
-komento ei voi lukea syötettä stdiniltä (ei siksi voi saada syötettä
Tämä esimerkki osoittaa, että putken oikeanpuoleisin komento voi itse asiassa , suoritetaan nykyisessä kuoressa. Tämä ei kuitenkaan itse asiassa vaikuta alkuperäiseen esimerkkiin. Jopa lastpipe
-toiminnon ollessa käytössä ja työn hallinta poistettu käytöstä, saamme kuitenkin seuraavan tuloksen, kun siirrytään bash
-palveluun:
> echo "x=42" | bash; echo $x >
Tämä johtuu siitä, että komento bash
suorittaa itse syötteensä alikuoressa.
Kommentit
- se on hyvä havainto, en tiennyt ' ei ymmärtänyt sitä, mutta kyllä luulen, että ' s kuinka putket toimivat
- Vain utelias, mikä on syy, miksi et hyväksynyt vastausta?
- Bash 4.2+: lle komentosarjaa suoritettaessa (tai tarkemmin, kun työn hallinta on pois päältä) ja shopt
lastpipe
on asetettu eikä putkea ole taustalla, se ajaa putken oikeanpuoleisen pään ' alkuun ' -kuori ei ole alikuori. Katso unix.stackexchange.com/questions/9954/… ja unix.stackexchange.com/questions/136206/readarray-or-pipe-issue - @ dave_thompson_085 Komento
bash
voidaan suorittaa yläkuori vaihtoehtojen mukaan, muttax=42
ajetaan varmasti sellaisessa, jota voidaan kohtuudella kutsua alikuoreksi. - @AlexanderMills Itse asiassa putki ei ole ' t ainoa asia.
bash
-komento suorittaa syötteensä alikuoressa riippumatta siitä, onko kyseessä putki. Katso lisätietoja ratkaisuni päivityksestä.
( eval 'echo "foo"' )