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
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, amelyeketbash
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}
eval "$(dircolors)"
ésszerű dolog. Ugyanez más, az adott mintát követő parancsokkal, például a gpg-agent.$(ssh-agent)
. Jó pont.