Tratto dalla pagina man di FreeBSD su sh (perché la piattaforma di destinazione online più conveniente è Debian se è importante):
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 ...]
...
Sono particolarmente interessato al caso d'uso di:
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
Esempio:
# 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
Ho notato che il primo argomento non è stato passato a myscript
e la documentazione allude a un name
parametro, su cui non ho visto una sezione doc. Nel mio esempio ho aggiunto l'annuncio _
al posto dell'argomento name, ma:
Cosa devo compilare per name
?
Risposta accettata:
Il modulo:
sh -c '...' name arg1 arg2 ...
si chiama inline-script, spesso visto in combinazione con find ... -exec sh -c '...' find-sh {} +
. All'interno dello script inline, $0
sarà impostato su name
e il resto degli argomenti è stato compilato in [email protected]
.
In generale, dovresti impostarlo su qualcosa di significativo, perché verrà utilizzato ad esempio per mostrare messaggi di errore:
sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set
Ma puoi impostare name
a qualsiasi parola che ti piace, per indicare il nome di inline-script:
sh -c 'printf "%sn" "$0"' custom-sh 1 2 3
custom-sh
Questo comportamento è definito da POSIX.