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

  • OTOH, eval "$(dircolors)" è una cosa ragionevole da fare. Lo stesso con molti altri comandi che seguono questo schema, come gpg-agent.
  • @derobert Sì e $(ssh-agent). Buon punto.

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 che bash comprende ([[ foo =~ ^f..$ ]]). Viene anche utilizzato per modificare le variabili in diversi modi: ${foo#bar}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *