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 setDienstprogramm 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 setLage - 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 set4, 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-DOCUMENTbeschreibt 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 rootBenutzer zu verwenden, ein Berechtigungsfehler zugestellt wird. Als ich antwortete, schlug ich ihn chownoder chgrpdie /dev/fd/${num}spezielle Datei vor, aber dies ist wahrscheinlich nicht die beste Methode. Der Grund , warum er dieses Thema Begegnungen ist rootist gewährt readBerechtigungen aber nicht execute Berechtigungen. Sie können dies einfach handhaben, indem Sie einfach einen execAnruf 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.45sowohl für Quell- als auch für Zielkonten.