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

  • OTOH, 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.
  • @derobert Da și $(ssh-agent). Bun punct.

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 care bash le înțelege ([[ foo =~ ^f..$ ]]). De asemenea, este utilizat pentru modificarea variabilelor în mai multe moduri: ${foo#bar}

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *