Recent, am folosit comanda echo prefixând-o cu $. Spre surprinderea mea, a rezultat o eroare. Comanda mea a fost ceva de genul acesta.
# !/bin/bash $(echo "a")
Eroarea a fost …
./test1.sh: line 3: a: command not found
Poate cineva să explice ce se întâmplă aici. Vă mulțumim anticipat.
Răspuns
$(echo a)
este o „substituire a comenzii”. $(...)
va fi înlocuit cu ieșirea comenzii din . Ieșirea în acest caz este a
, pe care apoi shell-ul încearcă să-l execute. Shell-ul nu poate localiza comanda numită a
și primiți mesajul de eroare.
Nu este clar care a fost intenția dvs. cu acest lucru sau ce vă așteptați să se întâmple. . Este extrem de neobișnuit să doriți să executați rezultatul unei înlocuiri de comandă.
Unele programe generează șiruri care ar trebui evaluate de către shell. Prin urmare, este posibil să vezi codul ca
eval "$(ssh-agent)"
care evaluează (rulează) ieșirea comenzii date. Aceste comenzi au o ieșire strict specificată și sunt considerate în general sigure pentru a rula în acest În exemplul de mai sus, ssh-agent
va începe procesul de agent SSH și va emite câteva comenzi care vor seta variabilele de mediu corespunzătoare pe care ssh
clientul mai târziu va trebui să utilizeze agentul, de exemplu,
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018;
Acesta este apoi evaluat de eval
.
eval
este folosit aici mai degrabă decât doar pur și simplu folosind $(ssh-agent)
deoarece ieșirea comenzii ssh-agent
este mai mult o comandă compusă. Fără eval
, terminatorii de comandă ;
ar fi net.
Exemplu:
$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world
Comentarii
Răspuns
Puteți utiliza set -x
vezi ce face shell-ul:
set -x $(echo "a") ++ echo a + a
Shell-ul execută echo a
și plasează ieșirea pe linia de comandă. Acesta este același lucru ca și când ați fi încercat să executați această linie de comandă:
a
Shell-ul caută o comandă a
în cale (și chiar și înainte în funcție, alias și liste hash), nu o găsește și astfel aruncă o eroare.
Funcționează dacă ieșirea este o comandă validă:
$(echo "ls")
Comentarii
- puteți să-mi spuneți, de fapt ce folosim $ other apoi apelăm o variabilă.
- @Ashu Este, de asemenea, utilizat și pentru substituirea comenzilor – cazul dvs. În plus, apare în calcul (
echo $((1+2+3))
), crearea șirului ($'foo\nbar'
/$"foo"
) și (mai puțin legat de coajă) în regexurile pe carebash
le înțelege ([[ foo =~ ^f..$ ]]
). De asemenea, este utilizat pentru modificarea variabilelor în mai multe moduri:${foo#bar}
eval "$(dircolors)"
este un lucru rezonabil de făcut. La fel și cu alte câteva comenzi care urmează acel model, cum ar fi gpg-agent.$(ssh-agent)
. Bun punct.