Odkryłem sh -c
polecenie. 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.
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
sh -c
? Byłoby bardzo miło, gdyby wykazało przypisanie parametrów pozycyjnych, które są wymienione w-c
częściman sh
.-c
Argumentem jest:Inne szczegóły
sh
arugmentów można znaleźć, uruchamiając:Przykładem użycia ciągu jako argumentu jest:
To jest bardziej szczegółowy
sh -c
przykład. Pobierze dokument z Dysku Google i otworzy go do edycji na komputerze:źródło
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 (1ARGV1
,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: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:Aby symulować sesje logowania i interaktywne:
źródło