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
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, sombash
forstår ([[ foo =~ ^f..$ ]]
). Det bruges også til at ændre variabler på flere måder:${foo#bar}
eval "$(dircolors)"
er en rimelig ting at gøre. Samme med flere andre kommandoer, der følger dette mønster, som gpg-agent.$(ssh-agent)
. Godt punkt.