Ostatnio użyłem polecenia echo poprzedzając go znakiem $. Ku mojemu zdziwieniu wynikało to z błędu. Moje polecenie wyglądało mniej więcej tak.
# !/bin/bash $(echo "a")
Wystąpił błąd …
./test1.sh: line 3: a: command not found
Czy ktoś może wyjaśnić, co się tutaj dzieje. Z góry dziękuję.
Odpowiedź
$(echo a)
to „podstawienie polecenia”. $(...)
zostanie zastąpione wyjściem polecenia w ramach . Dane wyjściowe w tym przypadku to a
, które powłoka próbuje następnie wykonać. Powłoka nie może „zlokalizować polecenia o nazwie a
i pojawia się komunikat o błędzie.
Nie jest jasne, jaki był Twój zamiar w tym celu ani co się spodziewałeś . Bardzo nietypowe jest wykonanie wyniku podstawienia polecenia.
Niektóre programy wypisują łańcuchy, które powinny być sprawdzone przez powłokę. Dlatego możliwe jest zobacz kod taki jak
eval "$(ssh-agent)"
, który ocenia (uruchamia) dane wyjściowe danego polecenia. Te polecenia mają ściśle określone dane wyjściowe i są ogólnie uważane za bezpieczne do wykonania w tym W powyższym przykładzie ssh-agent
uruchomi proces agenta SSH i wyświetli kilka poleceń, które ustawią odpowiednie zmienne środowiskowe, które ssh
klient będzie później musiał korzystać z agenta, na przykład
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018;
To jest następnie oceniane przez eval
.
eval
jest tutaj używane zamiast tylko po prostu używając $(ssh-agent)
, ponieważ wynik polecenia ssh-agent
jest bardziej poleceniem złożonym. Bez eval
, terminatory polecenia ;
byłyby specjalne.
Przykład:
$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world
Komentarze
Odpowiedź
Możesz użyć set -x
, aby zobacz, co robi powłoka:
set -x $(echo "a") ++ echo a + a
Powłoka wykonuje echo a
i umieszcza dane wyjściowe w wierszu poleceń. To jest to samo, co w przypadku próby wykonania tego wiersza poleceń:
a
Powłoka szuka polecenia a
w ścieżce (a nawet wcześniej w funkcji, aliasach i listach skrótów) nie znajduje go i zgłasza błąd.
Działa, jeśli wynikiem jest prawidłowe polecenie:
$(echo "ls")
Komentarze
- czy możesz mi powiedzieć, do czego właściwie używamy $ other niż wywoływanie zmiennej.
- @Ashu Oczywiście jest również używany do zastępowania poleceń – twój przypadek. Poza tym pojawia się w obliczeniach (
echo $((1+2+3))
), tworzeniu ciągu znaków ($'foo\nbar'
/$"foo"
) i (mniej związane z powłoką) w wyrażeniach regularnych, którebash
rozumie ([[ foo =~ ^f..$ ]]
). Jest również używany do modyfikowania zmiennych na kilka sposobów:${foo#bar}
eval "$(dircolors)"
to rozsądna rzecz. To samo z kilkoma innymi poleceniami, które są zgodne z tym wzorcem, np. Gpg-agent.$(ssh-agent)
. Słuszna uwaga.