Mam następującą prostą komendę powłoki, która, jak się spodziewam, zawiedzie i działa na moim lokalnym:
$ DIR=$(false) && echo ok || echo fail
fail
$ sh -c 'DIR=$(false) && echo ok || echo fail'
fail
Ale kiedy przekazuję to polecenie przez ssh, nie działa już zgodnie z oczekiwaniami:
$ ssh user@host sh -c 'DIR=$(false) && echo ok || echo fail'
ok
Nie jestem więc pewien, gdzie jest problem. Już używam apostrofu, aby uniknąć zbyt wczesnego rozszerzania zmiennych .
Co się dzieje i jak sprawić, by podstawienie polecenia działało poprawnie na podstawie kodu wyjścia zwróconego z przypisania zmiennej?
Znalazłem kolejną anomalię w następującym przykładzie:
$ ssh user@host sh -c 'echo 1; echo 2;'
2
który drukuje tylko 2, zamiast drukować zarówno 1, jak i 2.
źródło
sh -c echo 1; echo 2
.echo
Używany jest tylko pierwszy parametrsh -c
, co wyjaśnia dodatkowy nowy wiersz (1
jest ignorowany jako zbyteczny parametr); a średnik ograniczash
polecenie, więcecho 2
jest on wykonywany przez zdalną powłokę, a nie podpowłokę. Ponieważ nie ma rozszerzenia parametrów, możesz użyć obu rodzajów cudzysłowów, dzięki czemussh user@host sh -c "'echo 1; echo 2;'"
będzie działać zgodnie z oczekiwaniami.Powinno to działać zgodnie z oczekiwaniami:
Wygląda na to, że po wywołaniu jak powyżej pierwsza instrukcja w potoku powłoki nie będzie działać, jeśli jest to przypisanie zmiennej.
O dziwo, działa to również zgodnie z oczekiwaniami:
Nie jestem w 100% pewien, co się tutaj dzieje, ale może to być związane z tym pytaniem: https://unix.stackexchange.com/questions/126938/why-is-setting-a-variable-before-a-command- legalny w bash
źródło