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

  • OTOH, eval "$(dircolors)" er en rimelig ting å gjøre. Samme med flere andre kommandoer som følger det mønsteret, som gpg-agent.
  • @derobert Ja, og $(ssh-agent). Bra poeng.

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 som bash forstår ([[ foo =~ ^f..$ ]]). Den brukes også til å modifisere variabler på flere måter: ${foo#bar}

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *