GNU/Linux >> Tutoriels Linux >  >> Linux

Bash -c avec des paramètres positionnels ?

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

Linux
  1. Exécuter un programme avec divers paramètres (boucle) ?

  2. Tableaux bash avec exemples

  3. Paramètres spéciaux de Bash expliqués avec 4 exemples de scripts Shell

  4. Paramètres positionnels de Bash expliqués avec 2 exemples de scripts Shell

  5. Alias ​​avec variable dans bash

Qu'est-ce que Git Bash ? Travailler avec les commandes Git Bash

Comment écrire un script bash avec des exemples

Tutoriel Bash HereDoc avec exemples

Comment créer des documents avec des scripts Bash

Syntaxe Bash If Else avec exemples

Trier des nombres avec plusieurs décimales en bash