Odpowiedzi:
sh
wywołuje program sh
jako interpreter, a -c
flaga oznacza wykonanie następującego polecenia zgodnie z interpretacją tego programu.
W Ubuntu sh
jest zwykle dowiązanie symboliczne /bin/dash
, co oznacza, że jeśli wykonasz polecenie za sh -c
pomocą deski rozdzielczej, zamiast polecenia bash zostanie użyte polecenie powłoki. Powłoka wywoływana za pomocą sh
zależy od dowiązania symbolicznego - można to sprawdzić za pomocą readlink -e $(which sh)
. Powinieneś użyć, sh -c
gdy chcesz wykonać polecenie konkretnie z tą powłoką zamiast bash.
Możesz użyć tej składni ( -c
flagi) 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 -c
lub sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
zapisze plik bar
zawierający tekst foo
do /home/
, a sudo echo "foo" > /home/bar
nie 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
-c
Argumentem 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 sh
arugmentó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 -c
przykł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 -c
spawnuje nie-logującą się , nieinteraktywną sesję sh
( dash
w 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 ~/.bashrc
i /etc/bash.bashrc
itp. Nie będą dostępne w tej sesji, ponieważ nie są interaktywne . Możesz symulować zachowanie sesji interaktywnych (prawie), korzystając z -i
opcji:
sh -ic ...
Podobnie funkcje, które są specyficzne tylko dla powłok logowania (domyślnie), np. source
-Ing ~/.profile
(podane ~/.bash_profile
i ~/.bash_login
nie istnieją) i /etc/profile
nie zostaną wykonane, ponieważ powłoka jest powłoką niebędącą loginem . Możesz symulować zachowanie powłok logowania za pomocą -l
opcji:
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-c
częściman sh
.