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

  • OTOH, eval "$(dircolors)" to rozsądna rzecz. To samo z kilkoma innymi poleceniami, które są zgodne z tym wzorcem, np. Gpg-agent.
  • @derobert Yes i $(ssh-agent). Słuszna uwaga.

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óre bash rozumie ([[ foo =~ ^f..$ ]]). Jest również używany do modyfikowania zmiennych na kilka sposobów: ${foo#bar}

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *