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 integrierten set
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."
man set
NAME
set — set or unset options and positional parameters
SYNOPSIS
set [−abCefhmnuvx] [−o option] [argument...]
set [+abCefhmnuvx] [+o option] [argument...]
set −− [argument...]
set −o
set +o
Wenn Sie bereits die Werte haben, mit denen Sie die Shell füttern, müssen Sie dies nicht --
dreimal tun . Shell-Parameter sind in der set
Lage - immer und jederzeit, nicht nur beim Aufruf (außer $ 0 und -i):
su - mikeserv -c 'set -- "$*" ; echo "$*" ;
set -- 4 5 6 ; echo "$*"' -- -- 7 8 9
7 8 9
4 5 6
Und all diese Shell-Zitate können verwirrend sein. Dies vereinfacht die Dinge ein wenig:
( set -- 4 5 6
su - mikeserv 4<<-\CMD /dev/fd/4 "$@"
echo $0 "$*"
set -- "$*"
echo "$*"
set -- 7 8 9
echo "$*"
CMD
)
/dev/fd/4 4 5 6
4 5 6
7 8 9
Die Argumente der übergeordneten Shell lauten set
4, 5 und 6 und werden dann an die Subshell übergeben, die von su
ü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 ihn chown
oder chgrp
die /dev/fd/${num}
spezielle Datei vor, aber dies ist wahrscheinlich nicht die beste Methode. Der Grund , warum er dieses Thema Begegnungen ist root
ist gewährt read
Berechtigungen aber nicht execute
Berechtigungen. Sie können dies einfach handhaben, indem Sie einfach einen exec
Anruf vermeiden . Anstatt die /dev/fd/${num}
Datei direkt über die Befehlszeile aufzurufen, gehen Sie wie folgt vor:
su -c '. /dev/fd/'${num} ${num}<<SCRIPT
Die Verwendung von zwei Heredocs kann bei der Flucht helfen. Folgendes passiert in jedem Fall:
KEIN EINSTELLEN <<HEREDOC
sh 3<<\CMD /dev/fd/3
( echo 'without set "$@" or \$@ in here-doc' ; echo
set -- '1 "2" 3' 4 "5 6"
su - mikeserv 4<<-UNQUOTED 5<<-\PREQUOTED /dev/fd/4
echo UNQUOTED; echo $0 "$*"
printf "%s\\t\\t%s\\t\\t%s\\t\\t%s\\n" $(printf "'%s' " "$@") \\
$@ '$@' "$@" '"$@"' "'$@'" \$@ '\$@' "\$@" '"\$@"'
. /dev/fd/5
UNQUOTED
echo PREQUOTED ; echo $0 "$*"
printf "%s\t\t%s\t\t%s\t\t%s\n" $(printf "'%s' " "$@") \
$@ '$@' "$@" '"$@"' \$@ '\$@' "\$@" '"\$@"'
PREQUOTED
)
CMD
AUSGABE
without set "$@" or \$@ in here-doc
UNQUOTED
/dev/fd/3 1 2 3 4 5 6
1 "2" 3 4 5 6 1
2 3 4 5
6 1 "2" 3 4 5 6 1 2 3 4 5 6 "1 "2" 3 4 5 6"
'1 2 3 4 5 6' $@ "$@"
PREQUOTED
/dev/fd/5
'' $@ "$@" $@
\$@ $@ "\$@"
SET "$@"
IN<<HEREDOC
sh 3<<\CMD /dev/fd/3
( echo 'set "$@" and \$@ in here-doc' ; echo
set -- '1 "2" 3' 4 "5 6"
su - mikeserv 4<<-UNQUOTED 5<<-\PREQUOTED /dev/fd/4
set -- "$@" "\$@"
echo UNQUOTED; echo $0 "$*"
printf "%s\\t\\t%s\\t\\t%s\\t\\t%s\\n" $(printf "'%s' " "$@") \\
$@ '$@' "$@" '"$@"' "'$@'" \$@ '\$@' "\$@" '"\$@"'
. /dev/fd/5
UNQUOTED
set -- "$@" "\$@"
echo PREQUOTED ; echo $0 "$*"
printf "%s\t\t%s\t\t%s\t\t%s\n" $(printf "'%s' " "$@") \
$@ '$@' "$@" '"$@"' \$@ '\$@' "\$@" '"\$@"'
PREQUOTED
)
CMD
AUSGABE
set "$@" and \$@ in here-doc
UNQUOTED
/dev/fd/3 1 2 3 4 5 6
1 "2" 3 4 5 6 1
2 3 4 5
6 1 "2" 3 4 5 6 1 2 3 4 5 6 "1 "2" 3 4 5 6"
'1 2 3 4 5 6' 1 2 3 4 5 6 $@ 1 2 3 4 5 6
"$@"
PREQUOTED
/dev/fd/5 1 2 3 4 5 6 $@
'1 2 3 4
5 6' '$@' 1 2 3 4 5 6
$@ $@ 1 2 3 4 5 6 $@
"$@" $@ \$@ $@
"\$@"
SET "$@"
UND MEHR IN<<HEREDOC
sh 3<<\CMD /dev/fd/3
( echo 'set "$@" and \$@ AND additional parameters in here-doc' ; echo
set -- '1 "2" 3' 4 "5 6"
su - mikeserv 4<<-UNQUOTED 5<<-\PREQUOTED /dev/fd/4
set -- "$@" "\$@" '7 "8" 9' 10 "11 12"
echo UNQUOTED; echo $0 "$*"
printf "%s\\t\\t%s\\t\\t%s\\t\\t%s\\n" $(printf "'%s' " "$@") \\
$@ '$@' "$@" '"$@"' "'$@'" \$@ '\$@' "\$@" '"\$@"'
. /dev/fd/5
UNQUOTED
set -- "$@" "\$@" '13 "14" 15' 16 "17 18"
echo PREQUOTED ; echo $0 "$*"
printf "%s\t\t%s\t\t%s\t\t%s\n" $(printf "'%s' " "$@") \
$@ '$@' "$@" '"$@"' \$@ '\$@' "\$@" '"\$@"'
PREQUOTED
)
CMD
AUSGABE
set "$@" and \$@ AND additional parameters in here-doc
UNQUOTED
/dev/fd/3 1 2 3 4 5 6
1 "2" 3 4 5 6 1
2 3 4 5
6 1 "2" 3 4 5 6 1 2 3 4 5 6 "1 "2" 3 4 5 6"
'1 2 3 4 5 6' 1 2 3 4 5 6 7 "8" 9 10
11 12 $@ 1 2 3 4 5 6 7 "8" 9
10 11 12 "$@"
PREQUOTED
/dev/fd/5 1 2 3 4 5 6 7 "8" 9 10 11 12 $@ 13 "14" 15 16 17 18
'1 2 3 4
5 6' '7 "8"
9' '10' '11 12'
'$@' '13 "14" 15'
'16' '17 18' 1 2 3 4 5 6
7 "8" 9 10 11 12 $@
13 "14" 15 16 17 18 $@
1 2 3 4 5 6 7 "8" 9 10 11 12
$@ 13 "14" 15 16 17 18
"$@" $@ \$@ $@
"\$@"
bash 4.2.45
sowohl für Quell- als auch für Zielkonten.