Entnommen aus der Manpage von FreeBSD auf sh (weil es online am bequemsten ist, Zielplattform ist Debian, wenn es darauf ankommt):
SH(1) FreeBSD General Commands Manual SH(1)
NAME
sh -- command interpreter (shell)
SYNOPSIS
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] [script [arg ...]]
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -s [arg ...]
...
Ich interessiere mich besonders für den Anwendungsfall von:
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
Beispiel:
# Normal:
myscript hello world
myscript hello world >/var/log/myscript.combined 2>&1
# Constrained:
# - Arguments 'hello' and 'world' are suffixed by calling program.
myscript >/var/log/myscript.combined 2>&1 hello world
# Constrained Further:
# - Wrapped in `sh` to catch system messages, like Segmentation Fault
sh -c 'myscript [email protected]' _ >/var/log/myscript.combined 2>&1 hello world
Mir ist aufgefallen, dass das erste Argument nicht an myscript
übergeben wurde , und die Dokumentation spielt auf einen name
an Parameter, zu dem ich keinen Dokumentabschnitt gesehen habe. In meinem Beispiel habe ich die Anzeige _
hinzugefügt anstelle des Namensarguments, aber:
Was soll ich für name
ausfüllen? ?
Akzeptierte Antwort:
Das Formular:
sh -c '...' name arg1 arg2 ...
heißt Inline-Skript, oft in Kombination mit find ... -exec sh -c '...' find-sh {} +
. Innerhalb des Inline-Skripts, $0
wird auf name
gesetzt , und die restlichen Argumente wurden in [email protected]
eingefügt .
Im Allgemeinen sollten Sie es auf etwas Sinnvolles setzen, da es zum Beispiel zum Anzeigen von Fehlermeldungen verwendet wird:
sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set
Aber Sie können name
festlegen zu einem beliebigen Wort, um den Namen des Inline-Skripts anzugeben:
sh -c 'printf "%sn" "$0"' custom-sh 1 2 3
custom-sh
Dieses Verhalten wird von POSIX definiert.