Je veux rechercher la chaîne qui commence par un tiret/hyphène, comme suit -X
dans un fichier, mais il le confond avec un argument de ligne de commande.
J'ai essayé :
grep "-X"
grep \-X
grep '-X'
Je veux rechercher la chaîne qui commence par un tiret/hyphène, comme suit -X
dans un fichier, mais il le confond avec un argument de ligne de commande.
J'ai essayé :
grep "-X"
grep \-X
grep '-X'
Pour ceux d'entre nous qui se demandent à ce stade ce que --
signifie ou fait : unix.stackexchange.com/questions/11376/
Si vous voulez utiliser une variable comportant des espaces, vous devez utiliser quelque chose comme ceci : ARGS="-a -b -c"
grep -- "$ARGS"
Le tiret est un caractère spécial dans Bash, comme indiqué à l'adresse suivante http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Ainsi, l'échappement de ces caractères vous permet de passer outre Bash, mais Grep a toujours sa propre signification pour les tirets (en fournissant des options).
Vous devez donc vraiment y échapper deux fois (si vous préférez ne pas utiliser les autres réponses mentionnées). Les réponses suivantes fonctionneront/devraient fonctionner
grep \\-X
grep '\-X'
grep "\-X"
Une façon d'essayer comment Bash passe les arguments à un script/programme est de créer un script .sh qui ne fait qu'échouer tous les arguments. J'utilise un script appelé echo-args.sh pour jouer avec de temps en temps, tout ce qu'il contient est :
echo $*
Je l'invoque comme :
bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"
Vous voyez l'idée.
Je ne pense pas que - soit un caractère spécial dans Bash, malgré ce que dit le guide ABS. Bash ne traite pas les arguments commençant par - différemment des autres. La commande ou le module intégré que Bash appelle ensuite traitera les arguments commençant par un tiret comme bon lui semble. La plupart des modules intégrés de Bash et des commandes Linux et GNU traitent -- comme un terminateur d'option. Utilisez 'set -x' pour voir les commandes et les arguments que Bash utilise avant qu'ils ne soient exécutés, mais après que Bash ait étendu les échappements, les globes et les accolades. Grep est un exemple déroutant car il gère lui-même les échappements de barres obliques inversées.
La manière correcte serait d'utiliser "--" pour arrêter de traiter les arguments, comme déjà mentionné. Ceci est dû à l'utilisation de getopt_long (fonction C GNU de getopt.h) dans les sources de l'outil.
C'est pourquoi vous remarquez le même phénomène sur d'autres outils de ligne de commande ; puisque la plupart d'entre eux sont des outils GNU, et utilisent cet appel, ils présentent le même comportement.
A propos - getopt_long est ce qui nous donne le choix cool entre -rlo et --really_long_option et la combinaison des arguments dans l'interpréteur.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.