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
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ä, jotkabash
ymmärtävät ([[ foo =~ ^f..$ ]]
). Sitä käytetään myös muuttujien muokkaamiseen useilla tavoilla:${foo#bar}
eval "$(dircolors)"
on järkevä tehtävä. Sama useiden muiden komentojen kanssa, jotka seuraavat tätä mallia, kuten gpg-agent.$(ssh-agent)
. Hyvä asia.