Recentemente, ho usato il comando echo precedendolo con $. Con mia grande sorpresa ciò che ne è risultato è stato un errore. Il mio comando era qualcosa del genere.
# !/bin/bash $(echo "a")
Lerrore era ..
./test1.sh: line 3: a: command not found
Qualcuno può spiegare cosa sta succedendo qui. Grazie in anticipo.
Risposta
$(echo a)
è una “sostituzione di comando”. Il $(...)
sarà sostituito dal output del comando allinterno . Loutput in questo caso è a
, che la shell tenta quindi di eseguire. La shell non riesce a individuare il comando chiamato a
e viene visualizzato il messaggio di errore.
Non è chiaro quale fosse la tua intenzione o cosa ti aspettavi che accadesse . È molto insolito voler eseguire il risultato di una sostituzione di comando.
Alcuni programmi emettono stringhe che dovrebbero essere valutate dalla shell. È quindi possibile vedi codice come
eval "$(ssh-agent)"
che valuta (esegue) loutput del comando dato. Questi comandi hanno un output strettamente specificato e sono generalmente considerati sicuri da eseguire in questo Nellesempio precedente, ssh-agent
avvierà il processo dellagente SSH e produrrà alcuni comandi che imposteranno le variabili di ambiente appropriate che ssh
il client in seguito dovrà utilizzare lagente, ad esempio
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018;
Questo viene quindi valutato da eval
.
eval
viene utilizzato qui anziché solo utilizzando semplicemente $(ssh-agent)
poiché loutput del comando ssh-agent
è più un comando composto. Senza eval
, i ;
terminatori di comando net sarebbero speciali.
Esempio:
$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world
Commenti
Risposta
Puoi utilizzare set -x
per guarda cosa sta facendo la shell:
set -x $(echo "a") ++ echo a + a
La shell esegue echo a
e inserisce loutput sulla riga di comando. È come se avessi provato a eseguire questa riga di comando:
a
La shell cerca un comando a
nel percorso (e anche prima nelle liste di funzioni, alias e hash), non lo trova e quindi genera un errore.
Funziona se loutput è un comando valido:
$(echo "ls")
Commenti
- puoi dirmi per cosa in realtà usiamo $ other e poi chiamiamo una variabile.
- @Ashu Ovviamente è usato anche per la sostituzione dei comandi – il tuo caso. Inoltre appare nel calcolo (
echo $((1+2+3))
), nella creazione di stringhe ($'foo\nbar'
/$"foo"
) e (meno correlato alla shell) nelle regex chebash
comprende ([[ foo =~ ^f..$ ]]
). Viene anche utilizzato per modificare le variabili in diversi modi:${foo#bar}
eval "$(dircolors)"
è una cosa ragionevole da fare. Lo stesso con molti altri comandi che seguono questo schema, come gpg-agent.$(ssh-agent)
. Buon punto.