Co to jest polecenie sh -c?

30

Odkryłem sh -cpolecenie. Znalazłem go przed opublikowaniem tutaj, ale nie mogę znaleźć żadnych postów od Google, które to wyjaśniają, więc chciałbym wiedzieć, co to jest i jaka jest jego pełna składnia.

Lan ...
źródło

Odpowiedzi:

34

shwywołuje program shjako interpreter, a -cflaga oznacza wykonanie następującego polecenia zgodnie z interpretacją tego programu.

W Ubuntu shjest zwykle dowiązanie symboliczne /bin/dash, co oznacza, że ​​jeśli wykonasz polecenie za sh -cpomocą deski rozdzielczej, zamiast polecenia bash zostanie użyte polecenie powłoki. Powłoka wywoływana za pomocą shzależy od dowiązania symbolicznego - można to sprawdzić za pomocą readlink -e $(which sh). Powinieneś użyć, sh -cgdy chcesz wykonać polecenie konkretnie z tą powłoką zamiast bash.

Możesz użyć tej składni ( -cflagi) również z innymi tłumaczami. Jednym z klasycznych zastosowań (wskazanym przez @edwinksl) jest obejście problemu przekierowania, które nie działa z sudo (tutaj możesz użyć bash -club sh -c)

sudo sh -c 'echo "foo" > /home/bar'

zapisze plik barzawierający tekst foodo /home/, a sudo echo "foo" > /home/barnie jak wyjaśniono bardzo dobrze tutaj

Ważne jest stosowanie „pojedynczych cudzysłowów” wokół ciągu poleceń, w przeciwnym razie bieżąca powłoka spróbuje ją rozwinąć, zanim zostanie przekazana do wywołanego przez ciebie interpretera

na przykład (z pythonem, dopóki nie wymyślę polecenia, które dałoby inne wyniki w myślniku ...)

$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
Zanna
źródło
Czy możesz podać przykład użycia sh -c? Byłoby bardzo miło, gdyby wykazało przypisanie parametrów pozycyjnych, które są wymienione w -cczęści man sh.
edwinksl
15

-cArgumentem jest:

Odczytaj polecenia z argumentu ciąg_komendowy zamiast ze standardowego wejścia. Specjalny parametr 0 zostanie ustawiony na podstawie argumentu nazwa_komendy, a parametry pozycyjne ($ 1, $ 2 itd.) Ustawione na pozostałych argumentach argumentu.

Inne szczegóły sharugmentów można znaleźć, uruchamiając:

$ man sh

Przykładem użycia ciągu jako argumentu jest:

$ sh -c "echo This is a test string"

To jest bardziej szczegółowy sh -cprzykład. Pobierze dokument z Dysku Google i otworzy go do edycji na komputerze:

$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
LD James
źródło
11

sh -cspawnuje nie-logującą się , nieinteraktywną sesję sh( dashw Ubuntu).

Dane, które będą działać w tej sesji powłoki dodaje się polecenie, to należy traktować jako argumentu (położenia parametru) 0 ( ARGV0), a pozostała część, argument do tego polecenia ( ARGV0), zaczynając od (1 ARGV1, ARGV2...).

Możesz także użyć typowych funkcji powłoki, które mogą być uruchomione w tego rodzaju sesji, np. Rozdzielanie poleceń za pomocą, ;aby używać wielu poleceń, grupowanie poleceń za pomocą {}, spawnowanie kolejnej podpowłoki (), itd. Ich użycie może nieznacznie zmienić wspomniane wcześniej definicje / przykłady argumentów.


Należy zauważyć, że funkcje specyficzne tylko dla interaktywnych powłok (domyślnie), np. Rozszerzanie historii, source-ing ~/.bashrci /etc/bash.bashrcitp. Nie będą dostępne w tej sesji, ponieważ nie są interaktywne . Możesz symulować zachowanie sesji interaktywnych (prawie), korzystając z -iopcji:

sh -ic ...

Podobnie funkcje, które są specyficzne tylko dla powłok logowania (domyślnie), np. source-Ing ~/.profile(podane ~/.bash_profilei ~/.bash_loginnie istnieją) i /etc/profilenie zostaną wykonane, ponieważ powłoka jest powłoką niebędącą loginem . Możesz symulować zachowanie powłok logowania za pomocą -lopcji:

sh -lc ...

Aby symulować sesje logowania i interaktywne:

sh -lic ...
heemayl
źródło
+1 „sh -c spawnuje nie-logiczną, nieinteraktywną sesję sh”
JSON C11