Je n'arrive pas à utiliser le Bash option “-c” avec des arguments après l'option “-c” de la chaîne
La page de manuel de Bash dit, au sujet de la -c
option:
-c string
Si le-c
option est présente, alors les commandes sont lues à partir de
string
. Si il y a des arguments après
la chaîne, ils sont affectés à l'
les paramètres positionnels, en commençant par
$0
.
Alors au vu de cette description, je pense que quelque chose comme cela devrait fonctionner:
bash -c "echo arg 0: $0, arg 1: $1" arg1
mais la sortie est le suivant, donc il semble que les arguments après le -c
chaîne ne sont pas attribuées aux paramètres positionnels.
arg 0: -bash, arg 1:
Je suis en cours d'exécution assez ancienne Bash (sur Fedora 4):
[root@dd42 tronc]# bash --version
GNU bash, version 3.00.16(1)-release i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
Je suis vraiment essayer d'exécuter un peu d'un script shell avec des arguments. J'ai pensé -c
avait l'air très prometteur, d'où la question ci-dessus. Je me demandais à propos de l'utilisation d'eval, mais je ne pense pas que je peux passer des arguments à la substance qui suit eval. Je suis ouvert à d'autres suggestions.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'utiliser les guillemets simples pour éviter d'interpolation qui se passe dans votre shell.
Ou échapper à l'variables dans votre chaîne de caractères entre guillemets. Pour l'utiliser dépend exactement ce que vous voulez mettre dans votre extrait de code.
Parce que "
$0
" et "$1
' dans votre chaîne est remplacée par une variable #0 et #1 respectivement.Essayer :
Dans ce code
$
de tous les deux sont échapper de base de la voir comme une chaîne de caractères$
et pas remplacés.Le résultat de cette commande est:
Espère que cette aide.
martin est à droite sur l'interpolation: vous devez utiliser des guillemets simples. Mais notez que si vous essayez de passer des arguments à une commande en cours d'exécution dans la chaîne, vous devez les transmettre de manière explicite. Par exemple, si vous avez un script foo.sh comme:
Alors vous devriez l'appeler comme cela:
Ou plus généralement
bash -c '${0} ${1+"$@"}' <command> [argument]...
Pas comme ce:
Ni comme ceci:
Cela signifie que vous pouvez passer en arguments à des sous-processus, sans leur incorporation dans la chaîne de commande, et sans se soucier d'y échapper.
Ajouter une barre oblique inverse à la
$0
(c'est à dire,\$0
), sinon le shell courant échappe$0
au nom de la coquille avant même qu'elle arrive à le shell interne est exécuté.