Viime aikoina käytin echo-komentoa etuliittämällä sen dollarilla. Yllätyksekseni, mitä se johti, oli virhe. Komentoni oli jotain tällaista.

# !/bin/bash $(echo "a") 

Virhe oli ..

./test1.sh: line 3: a: command not found 

Voiko kukaan selittää, mitä täällä tapahtuu. Kiitos etukäteen.

Vastaus

$(echo a) on ”komennon korvaaminen”. $(...) korvataan -komennon tuotoksella . Tulos on tässä tapauksessa a, jonka komentotulkki yrittää suorittaa. Kuori ei löydä a -nimistä komentoa ja saat virheilmoituksen.

On epäselvää, mitä aikomuksesi tällä tarkoitit tai mitä odotit tapahtuvan . on erittäin epätavallista halua suorittaa komentojen korvaamisen tulos.


Jotkut ohjelmat antavat merkkijonot, jotka komentotulkin tulisi arvioida. Siksi on mahdollista katso koodi, kuten

eval "$(ssh-agent)" 

, joka arvioi (suorittaa) annetun komennon lähdön. Näillä komennoilla on tarkoin määritelty lähtö ja niiden katsotaan yleensä olevan turvallisia suorittaa tässä Yllä olevassa esimerkissä ssh-agent käynnistää SSH-agenttiprosessin ja antaa muutaman komennon, jotka asettavat sopivat ympäristömuuttujat, jotka ssh asiakkaan on myöhemmin käytettävä esimerkiksi edustajaa.

SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018; 

Tämän arvioi sitten eval.

eval käytetään tässä pikemminkin kuin vain yksinkertaisesti käyttämällä $(ssh-agent), koska komennon ssh-agent lähtö on enemmän yhdistetty komento. Ilman eval ; -komennon terminaattorit olisivat erityisiä.

Esimerkki:

$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world 

Kommentit

  • OTOH, eval "$(dircolors)" on järkevä tehtävä. Sama useiden muiden komentojen kanssa, jotka seuraavat tätä mallia, kuten gpg-agent.
  • @derobert Kyllä ja $(ssh-agent). Hyvä asia.

Vastaa

Voit käyttää set -x katso, mitä komentotulkki tekee:

set -x $(echo "a") ++ echo a + a 

Kuori suorittaa echo a ja laittaa lähdön komentoriville. Tämä on sama kuin jos olisit yrittänyt suorittaa tämän komentorivin:

a 

Kuori etsii komentoa a polussa (ja vielä aiemmin funktiossa, aliaksissa ja hash-luetteloissa) ei löydä sitä ja heittää siten virheen.

Se toimii, jos lähtö on kelvollinen komento:

$(echo "ls") 

Kommentit

  • Voitteko kertoa minulle, mitä varten käytämme $ muuta ja kutsumme sitten muuttujaa.
  • @Ashu Sitä käytetään ilmeisesti myös komentojen korvaamiseen – sinun tapauksessasi. Sen lisäksi, että se näkyy laskennassa (echo $((1+2+3))), merkkijonojen luomisessa ($'foo\nbar' / $"foo") ja (vähemmän kuoriin liittyvää) regekseissä, jotka bash ymmärtävät ([[ foo =~ ^f..$ ]]). Sitä käytetään myös muuttujien muokkaamiseen useilla tavoilla: ${foo#bar}

Vastaa

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