Nylig brukte jeg ekkokommandoen foran den $. Til min overraskelse var det en feil. Min kommando var noe sånt som dette.
# !/bin/bash $(echo "a")
Feilen var ..
./test1.sh: line 3: a: command not found
Kan noen forklare hva som skjer her. Takk på forhånd.
Svar
$(echo a)
er en «kommandosubstitusjon». $(...)
vil bli erstattet av utdata fra kommandoen i . Utgangen i dette tilfellet er a
, som skallet deretter prøver å utføre. Skallet kan ikke finne kommandoen kalt a
, og du får feilmeldingen.
Det er uklart hva du har tenkt med dette eller hva du forventet å skje. . Det er veldig uvanlig å ønske å utføre resultatet av en kommandosubstitusjon.
Noen programmer sender ut strenger som skal evalueres av skallet. Det er derfor mulig å se kode som
eval "$(ssh-agent)"
som evaluerer (kjører) utgangen til den gitte kommandoen. Disse kommandoene har en strengt spesifisert utgang og anses generelt som trygge å kjøre i dette I eksemplet ovenfor vil ssh-agent
starte SSH-agentprosessen og sende ut noen få kommandoer som vil sette de aktuelle miljøvariablene som ssh
klienten vil senere trenge for å bruke agenten, for eksempel
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 blir deretter evaluert av eval
.
eval
brukes her i stedet for bare ganske enkelt å bruke $(ssh-agent)
siden utgangen fra ssh-agent
-kommandoen er mer en sammensatt kommando. Uten eval
, ville ;
kommandoterminatorer netto være spesielle.
Eksempel:
$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world
Kommentarer
Svar
Du kan bruke set -x
til se hva skallet gjør:
set -x $(echo "a") ++ echo a + a
Skallet utfører echo a
og setter utdataene på kommandolinjen. Dette er det samme som om du hadde prøvd å utføre denne kommandolinjen:
a
Skallet ser etter en kommando a
i banen (og til og med før i funksjonen, alias og hash-lister), finner den ikke og kaster dermed en feil.
Det fungerer hvis utgangen er en gyldig kommando:
$(echo "ls")
Kommentarer
- kan du fortelle meg, hva bruker vi faktisk $ andre til å kalle en variabel.
- @Ashu Det brukes åpenbart også til kommandosubstitusjon – saken din. Dessuten vises det i beregning (
echo $((1+2+3))
), strengoppretting ($'foo\nbar'
/$"foo"
) og (mindre skallrelatert) i regeksene sombash
forstår ([[ foo =~ ^f..$ ]]
). Den brukes også til å modifisere variabler på flere måter:${foo#bar}
eval "$(dircolors)"
er en rimelig ting å gjøre. Samme med flere andre kommandoer som følger det mønsteret, som gpg-agent.$(ssh-agent)
. Bra poeng.