eval vs. pipe kautta bash

Mitä eroa on käyttää:

eval "echo "foo"" 

ja

echo "echo "foo"" | bash 

onko niitä?

Kommentit

  • Tässä ' on toinen muunnelma, jolla on hieman erilainen käyttäytyminen suoritusympäristöissä: ( eval 'echo "foo"' )

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, mutta x=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ä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *