Tiré de la page de manuel de FreeBSD sur sh (parce que c'est la plate-forme cible la plus pratique en ligne, c'est Debian si c'est important) :
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 ...]
...
Je suis particulièrement intéressé par le cas d'utilisation de :
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
Exemple :
# 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
J'ai remarqué que le premier argument n'était pas passé à myscript
, et la documentation fait allusion à un name
paramètre, sur lequel je n'ai pas vu de section doc. Dans mon exemple, j'ai ajouté l'annonce _
à la place de l'argument nom, mais :
Que dois-je remplir pour name
?
Réponse acceptée :
Le formulaire :
sh -c '...' name arg1 arg2 ...
est appelé script en ligne, souvent associé à find ... -exec sh -c '...' find-sh {} +
. Dans le script en ligne, $0
sera défini sur name
, et le reste des arguments a été rempli avec [email protected]
.
En général, vous devez le définir sur quelque chose de significatif, car il sera utilisé par exemple pour afficher des messages d'erreur :
sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set
Mais vous pouvez définir name
à n'importe quel mot que vous aimez, pour indiquer le nom du script en ligne :
sh -c 'printf "%sn" "$0"' custom-sh 1 2 3
custom-sh
Ce comportement est défini par POSIX.