Habituellement, $0
dans un script est défini sur le nom du script, ou sur ce qu'il a été invoqué (y compris le chemin). Cependant, si j'utilise bash
avec le -c
option, $0
est défini sur le premier des arguments passés après la chaîne de commande :
bash -c 'echo $0' foo bar
# foo
En effet, il semble que les paramètres de position aient été décalés, mais en incluant $0
. Cependant shift
dans la chaîne de commande n'affecte pas $0
(comme d'habitude) :
bash -c 'echo $0; shift; echo $0' foo bar
# foo
# foo
Pourquoi ce comportement apparemment étrange pour les chaînes de commande ?
Notez que je cherche la raison, la justification, derrière la mise en œuvre d'un comportement aussi étrange.
On pourrait supposer qu'une telle chaîne de commande n'aurait pas besoin du $0
paramètre tel qu'il est généralement défini, donc pour l'économie, il est également utilisé pour les arguments normaux. Cependant, dans ce cas, le comportement de shift
est impair. Une autre possibilité est que $0
est utilisé pour définir le comportement des programmes (à la bash
appelé comme sh
ou vim
appelé vi
), mais ce n'est pas possible, puisque $0
here n'est visible que dans la chaîne de commande et non par les programmes qui y sont appelés. Je ne vois pas d'autres utilisations pour $0
, donc je suis incapable d'expliquer cela.
Réponse acceptée :
Cela vous donne la possibilité de définir/choisir $0
lors de l'utilisation d'un script en ligne. Sinon, $0
serait juste bash
.
Ensuite, vous pouvez faire par exemple :
$ echo foo > foo
$ bash -c 'wc -c < "${1?}"' getlength foo
4
$ rm -f bar
$ bash -c 'wc -c < "${1?}"' getlength bar
getlength: bar: No such file or directory
$ bash -c 'wc -c < "${1?}"' getlength
getlength: 1: parameter not set
Tous les obus ne faisaient pas ça. L'obus Bourne l'a fait. Le shell Korn (et Almquist) a choisi de faire passer le premier paramètre à $1
Au lieu. POSIX a finalement opté pour la méthode Bourne, donc ksh
et ash
les dérivés y sont revenus plus tard (plus à ce sujet sur http://www.in-ulm.de/~mascheck/various/find/#shell). Cela signifiait que pendant longtemps pour sh
(qui selon le système était basé sur le shell Bourne, Almquist ou Korn), vous ne saviez pas si le premier argument allait dans $0
ou $1
, donc pour la portabilité, vous deviez faire des choses comme :
sh -c 'echo foo in "$1"' foo foo
Ou :
sh -c 'shift "$2"; echo txt files are "[email protected]"' tentative-arg0 3 2 *.txt
Heureusement, POSIX a spécifié le nouveau comportement où le premier argument va dans $0
, donc nous pouvons maintenant faire de manière portable :
sh -c 'echo txt files are "[email protected]"' meaningful-arg0-for-error *.txt