man su
sagt:
You can use the -- argument to separate su options from the arguments
supplied to the shell.
man bash
sagt:
-- A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments. An argument of - is equivalent to --.
Na dann mal sehen:
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
Was ich erwartet habe (Ausgabe des zweiten Befehls ist unterschiedlich):
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
Wahrscheinlich kein großes Problem. Aber was passiert dort? Die zweite und die dritte Variante scheinen der richtige Weg zu sein, aber eine davon funktioniert nicht. Der vierte scheint unzuverlässig, -
kann als su
Option behandelt werden.
bash 4.2.45
sowohl für Quell- als auch für Zielkonten.Antworten:
Was passiert ist, dass das erste Argument, das Sie der Shell geben, der
$0
Parameter ist (normalerweise ist dies der Name der Shell). Es ist nicht enthalten, wenn Sie dies tun,echo $*
da$*
jedes Argument außer$0
.Beispiel:
Aktualisieren
Führen Sie den folgenden Befehl aus:
ergibt die Strace-Linie:
Es scheint also, dass in diesem Fall
su
das Extra verschlungen wird,--
ohne es an Bash weiterzugeben, möglicherweise aufgrund eines Fehlers (oder zumindest eines undokumentierten Verhaltens). Es wird jedoch nicht mehr als zwei der--
Argumente auffressen :quelle
su - yuri -c 'echo "$*"' -- -- 1 2 3
, die Shell bekommt angeblich-- 1 2 3
, gibt aber nur aus2 3
. Macht es überhaupt Sinn?bash -c 'echo $*' -- 1 2 3
, wird es1 2 3
wie erwartet ausgegeben.su
Fehler zu sein.Tatsächlich bezieht sich die Antwort von @ Graeme - und Ihre Frage - nur auf Nebenwirkungen der Handhabung der Shell.
"$@positional $*parameters".
Diese werden von der Shell beim Aufruf und zu einem späteren Zeitpunkt mit dem integriertenset
Dienstprogramm ihren Argumenten zugewiesen . Sie können jederzeit aufgerufen werden, indem entweder"$*"
jede Position mit dem ersten Zeichen in geteilt wird"$IFS"
oder"$@"
jede Position zitiert und mit allen geteilt wird"$IFS."
Wenn Sie bereits die Werte haben, mit denen Sie die Shell füttern, müssen Sie dies nicht
--
dreimal tun . Shell-Parameter sind in derset
Lage - immer und jederzeit, nicht nur beim Aufruf (außer $ 0 und -i):Und all diese Shell-Zitate können verwirrend sein. Dies vereinfacht die Dinge ein wenig:
Die Argumente der übergeordneten Shell lauten
set
4, 5 und 6 und werden dann an die Subshell übergeben, die vonsu
über die Position aufgerufen wirdparameter "$@array".
Beachten Sie, wie ich
( subshell )
den obigen Befehl verwende - ich mache das, weil ich nicht mit meiner aktuellen Shell-Umgebung herumspielen möchte -, weil ich versehentlich etwas ändern kann, das ich lieber nicht möchte, wenn ich es getan habeset.
ÜBER UMLEITUNG:
Zunächst arbeitet Ihr Unix-System mit Dateien - Dateiberechtigungen, Dateiinhalten, Dateiattributen. Auf die eine oder andere Weise kann (und sollte) jedes von Ihnen verwendete Datenobjekt als Datei adressiert werden. Die Umleitung zeigt auf eine Datei - das ist alles. A
<<HERE-DOCUMENT
beschreibt eine Datei inline und leitet sie dann um. Entweder werden Shell-Erweiterungen interpretiert oder nicht.Der Fragesteller stellt in den Kommentaren unten fest, dass ihm beim Versuch, diese Methode als
root
Benutzer zu verwenden, ein Berechtigungsfehler zugestellt wird. Als ich antwortete, schlug ich ihnchown
oderchgrp
die/dev/fd/${num}
spezielle Datei vor, aber dies ist wahrscheinlich nicht die beste Methode. Der Grund , warum er dieses Thema Begegnungen istroot
ist gewährtread
Berechtigungen aber nichtexecute
Berechtigungen. Sie können dies einfach handhaben, indem Sie einfach einenexec
Anruf vermeiden . Anstatt die/dev/fd/${num}
Datei direkt über die Befehlszeile aufzurufen, gehen Sie wie folgt vor:Die Verwendung von zwei Heredocs kann bei der Flucht helfen. Folgendes passiert in jedem Fall:
KEIN EINSTELLEN
<<HEREDOC
AUSGABE
SET
"$@"
IN<<HEREDOC
AUSGABE
SET
"$@"
UND MEHR IN<<HEREDOC
AUSGABE
quelle
"8 9\n4 5 6\n"
. Ich laufedebian 6
,bash-4.1.5
undsu
.root
, heißt es :-su: /dev/fd/4: Permission denied
. Wissen Sie übrigens, was das bedeutet? Andernfalls wird ausgegeben, wie Sie sagen, aber die Frage wird nicht beantwortet. Frage ist über die Verwendung von--
und-
.chown /dev/fd/4
für die Dauer tun solltest, die du brauchst, oder einfachchgrp
. Ich habe momentan nicht viel Zeit zum Testen. Aber das ist ein wenig nebensächlich, ebenso wie das andere, bei dem Sie überhaupt keine Argumente am hinteren Ende übergeben müssen - arbeiten Sie einfach an Ihrem Zitat. Sieh es jetzt?su
nicht mit umgeleiteten arbeiten könnenstdin
, ist es immer noch besser, Argumente zu übergeben, als sie in den Befehl einzufügen. Denn im letzteren Fall müssen Sie ihnen entkommen.