Antworten:
sh
Ruft das Programm sh
als Interpreter auf und das -c
Flag bedeutet, dass der folgende Befehl ausgeführt wird, wie er von diesem Programm interpretiert wird.
In Ubuntu sh
wird in der Regel mit symbolisiert /bin/dash
, was bedeutet, dass, wenn Sie einen Befehl mit sh -c
der Dash-Shell ausführen, der Befehl anstelle von bash ausgeführt wird. sh
Welche Shell mit aufgerufen wird, hängt vom Symlink ab - das können Sie mit herausfinden readlink -e $(which sh)
. Sie sollten verwenden, sh -c
wenn Sie einen Befehl speziell mit dieser Shell anstelle von bash ausführen möchten.
Sie können diese Syntax (das -c
Flag) auch für andere Interpreter verwenden. Eine klassische Verwendung davon (von @edwinksl hervorgehoben) ist, das Problem der Umleitung zu umgehen , das nicht mit sudo funktioniert (hier könnten Sie bash -c
oder verwenden sh -c
).
sudo sh -c 'echo "foo" > /home/bar'
schreibt die Datei, bar
die den Text enthält, foo
an /home/
, während sudo echo "foo" > /home/bar
dies, wie hier sehr gut erklärt , fehlschlägt
Es ist wichtig, die Befehlszeichenfolge in einfache Anführungszeichen zu setzen, da die aktuelle Shell sonst versucht, sie zu erweitern, bevor sie an den aufgerufenen Interpreter übergeben wird
zum Beispiel (mit Python, bis ich an einen Befehl denke, der in Strichen unterschiedliche Ergebnisse liefert ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
Das -c
Argument lautet:
Lesen Sie die Befehle vom Operanden command_string anstelle der Standardeingabe. Der Sonderparameter 0 wird aus dem Operanden befehlsname und die Positionsparameter ($ 1, $ 2 usw.) aus den übrigen Argumentoperanden gesetzt.
Weitere Details zu den sh
Arugments finden Sie unter:
$ man sh
Ein Beispiel für die Verwendung eines Strings als Argument ist:
$ sh -c "echo This is a test string"
Dies ist ein ausführlicheres sh -c
Beispiel. Es wird ein Dokument von Google Drive heruntergeladen und zur Bearbeitung auf dem Desktop geöffnet:
$ 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
erzeugt eine nicht-Login , nicht-interaktive Sitzung von sh
( dash
in Ubuntu).
Der Befehl folgt, in dieser Shell - Sitzung ausgeführt werden wird, wird es als Argument (Positionsparameter) behandelt werden , 0 ( ARGV0
) und der verbleibende Teil als das Argument zu diesem Befehl ( ARGV0
), ausgehend von 1 ( ARGV1
, ARGV2
, ...).
Sie können auch typische Shell-Funktionen verwenden, die in dieser Art von Sitzung ausgeführt werden dürfen, z. B. die Befehlstrennung mithilfe ;
von mehreren Befehlen, die Befehlsgruppierung mithilfe von {}
, das Erzeugen einer weiteren Subshell mit ()
usw. Die Verwendung dieser kann die zuvor erwähnten Argumentdefinitionen / -beispiele geringfügig ändern.
Zu beachten ist, dass die Funktionen, die nur für interaktive Shells gelten (standardmäßig), z. B. Verlaufserweiterung, source
-en von ~/.bashrc
und /etc/bash.bashrc
usw., in dieser Sitzung nicht verfügbar sind, da sie nicht interaktiv sind . Sie können ein interaktives Sitzungsverhalten (fast) simulieren, indem Sie die folgende -i
Option verwenden:
sh -ic ...
Ebenso werden die Funktionen, die nur für Login- Shells spezifisch sind (standardmäßig), z. B. source
-ing von ~/.profile
(angegeben ~/.bash_profile
und ~/.bash_login
nicht vorhanden) /etc/profile
, nicht ausgeführt, da die Shell keine Login- Shell ist. Sie können das Verhalten von Login-Shells mithilfe der folgenden -l
Option simulieren :
sh -lc ...
So simulieren Sie Anmeldesitzungen und interaktive Sitzungen:
sh -lic ...
sh -c
? Wäre besonders schön, wenn es die Zuordnung von Positionsparametern demonstriert, die im-c
Teil von erwähnt werdenman sh
.