Odpowiedzi:
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
-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"
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 ...
sh -c? Byłoby bardzo miło, gdyby wykazało przypisanie parametrów pozycyjnych, które są wymienione w-cczęściman sh.