Nemrégiben az echo parancsot előtaggal használtam a $ -val. Meglepetésemre, hogy ennek mi lett a hibája. A parancsom valami ilyesmi volt.

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

A hiba az volt.

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

Meg tudja valaki magyarázni, mi történik itt. Előre is köszönöm.

Válasz

$(echo a) egy “parancscsere”. A $(...) helyére a parancs belsejében található kimenet kerül. A kimenet ebben az esetben a, amelyet a héj megpróbál végrehajtani. A shell nem tudja megtalálni a a nevű parancsot, és megjelenik a hibaüzenet.

Nem világos, hogy mi volt a szándéka ezzel, vagy mire számítottál . Nagyon szokatlan a parancscsere eredményének végrehajtása.


Néhány program olyan kimeneti karakterláncokat tartalmaz, amelyeket a shellnek ki kell értékelnie. Ezért lehetséges lásd az olyan kódot, mint

eval "$(ssh-agent)" 

, amely kiértékeli (futtatja) az adott parancs kimenetét. Ezeknek a parancsoknak szigorúan meghatározott kimenete van, és általában biztonságosnak tekinthetők ebben A fenti példában a ssh-agent elindítja az SSH ügynök folyamatát, és kiad néhány parancsot, amelyek beállítják a megfelelő környezeti változókat, amelyeket az ssh később az ügyfélnek szüksége lesz például az ügynök használatára.

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

Ezt azután eval értékeli.

eval itt használatos, nem csak egyszerűen az $(ssh-agent) használatával, mivel a ssh-agent parancs kimenete inkább összetett parancs. eval nélkül a ; parancsok terminátorai speciálisak lennének.

Példa:

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

Megjegyzések

  • OTOH, eval "$(dircolors)" ésszerű dolog. Ugyanez más, az adott mintát követő parancsokkal, például a gpg-agent.
  • @derobert Igen és $(ssh-agent). Jó pont.

Válasz

A set -x használatával nézze meg, mit csinál a shell:

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

A shell végrehajtja a echo a parancsot, és a kimenetet a parancssorba helyezi. Ez ugyanaz, mintha megpróbálta végrehajtani ezt a parancssort:

a 

A héj parancsot keres a az útvonalban (és még a függvényben, az álnevekben és a hash listákban még korábban) nem találja meg, és így hibát dob.

Akkor működik, ha a kimenet érvényes parancs:

$(echo "ls") 

Megjegyzések

  • el tudnád mondani, hogy valójában mire használjuk a $ other szót, majd egy változót hívunk meg.
  • @Ashu Nyilvánvalóan a parancsok helyettesítésére is használják – az Ön esete. Emellett a számításban (echo $((1+2+3))), a karakterlánc létrehozásában ($'foo\nbar' / $"foo") és (kevesebb héjhoz kapcsolódó) a regexexekben, amelyeket bash megért ([[ foo =~ ^f..$ ]]). A változók többféleképpen történő módosítására is használják: ${foo#bar}

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük