For nylig brugte jeg ekko-kommandoen med $ foran. Til min overraskelse var det en fejl, hvad det resulterede i. Min kommando var noget som dette.

# !/bin/bash $(echo "a") 

Fejlen var ..

./test1.sh: line 3: a: command not found 

Kan nogen forklare, hvad der sker her. På forhånd tak.

Svar

$(echo a) er en “kommandosubstitution”. $(...) erstattes af output fra kommandoen inden for . Output i dette tilfælde er a, som skallen derefter forsøger at udføre. Skallen kan ikke finde kommandoen a, og du får fejlmeddelelsen.

Det er uklart, hvad din hensigt med dette var, eller hvad du forventede at ske . Det er meget usædvanligt at ønske at udføre resultatet af en kommandosubstitution.


Nogle programmer udsender strenge, der skal evalueres af skallen. Det er derfor muligt at se kode som

eval "$(ssh-agent)" 

som evaluerer (kører) output for den givne kommando. Disse kommandoer har en strengt specificeret output og anses generelt for at være sikre at køre i denne I eksemplet ovenfor starter ssh-agent SSH-agentprocessen og sender et par kommandoer, der indstiller de relevante miljøvariabler, som ssh klient skal senere bruge agenten, f.eks.

SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018; 

Dette evalueres derefter af eval.

eval bruges her snarere end bare ved blot at bruge $(ssh-agent) da output fra ssh-agent kommandoen mere er en sammensat kommando. Uden eval ville kommandoterminatorerne ; være netop specielle.

Eksempel:

$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world 

Kommentarer

  • OTOH, eval "$(dircolors)" er en rimelig ting at gøre. Samme med flere andre kommandoer, der følger dette mønster, som gpg-agent.
  • @derobert Ja, og $(ssh-agent). Godt punkt.

Svar

Du kan bruge set -x til se hvad skallen gør:

set -x $(echo "a") ++ echo a + a 

Skallen udfører echo a og sætter output på kommandolinjen. Dette er det samme som hvis du havde forsøgt at udføre denne kommandolinje:

a 

Skallen leder efter en kommando a i stien (og endda før i funktionen, alias og hashlister), finder den ikke og kaster således en fejl.

Det fungerer, hvis output er en gyldig kommando:

$(echo "ls") 

Kommentarer

  • kan du fortælle mig, hvad vi faktisk bruger $ anden til at kalde en variabel.
  • @Ashu Det bruges naturligvis også til kommandosubstitution – din sag. Udover det vises i beregning (echo $((1+2+3))), strengoprettelse ($'foo\nbar' / $"foo") og (mindre shell-relateret) i regexerne, som bash forstår ([[ foo =~ ^f..$ ]]). Det bruges også til at ændre variabler på flere måder: ${foo#bar}

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *