Impossible de passer le caractère '#' comme argument de ligne de commande

36

Je ne peux pas passer de chaînes commençant par #comme arguments de ligne de commande.

Voici un test simple:

#include <stdio.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%s ", argv[i]);

    putchar('\n');

    return 0;
}

Si j'entre les arguments comme suit:

2 4 # 5 6

La valeur de argcest 3et non 6. Il lit #et s'arrête là. Je ne sais pas pourquoi et je ne trouve pas la réponse dans mes copies de The C Programming Language et C Primer Plus .

cd-00
la source
44
la coloration syntaxique sur StackOverflow illustre bien votre problème :)
Brad Allred

Réponses:

47

#commence un commentaire dans les shells Unix, un peu comme //dans C.

Cela signifie que lorsque le shell passe les arguments au programme, il ignore tout ce qui suit le #. L'échapper avec une barre oblique inverse ou des guillemets signifie qu'il est traité comme les autres paramètres et que le programme devrait fonctionner comme prévu.

2 4 \# 5 6

ou

2 4 '#' 5 6

ou

2 4 "#" 5 6

Notez que le #est un caractère de commentaire uniquement au début d'un mot, donc cela devrait également fonctionner:

2 4#5 6
fanduin
la source
2
Cela semble être une assez bonne liste unix.stackexchange.com/a/270979
fanduin
22
@ cd-00 Vous devez apprendre comment fonctionne le shell. Cela n'a rien à voir avec votre code C.
chepner
3
Ah, vous pouvez donc taper des commentaires dans des sessions shell interactives , afin que le shell puisse les ignorer immédiatement après avoir fini de les taper. Quelle fonctionnalité utile.
Joker_vD
6
@Joker_vD Alors que vous considérez un shell comme une interface de ligne de commande, c'est en fait un interpréteur de script. Le fait que vous puissiez l'utiliser comme une CLI interactive est un bon bonus. Pourquoi l'interprété devrait-il se comporter de manière très différente lorsque vous "exécutez un script" par rapport à la saisie interactive de commandes? Qu'en est-il echo echo Hello, World | bash. Est-ce interactif? Ou peut bash <<END- être ?
Christopher Schultz
6
@Joker_vD: Je tape fréquemment des commentaires dans des sessions interactives pour me référer à mon historique de shell. Parfois, il s'agit d'enregistrer un hachage de validation ou un autre ID émis vers stdout; Parfois, c'est pour noter qu'une commande a échoué en tant que note pour mon futur moi; Parfois, il s'agit d'enregistrer des données de synchronisation pour une analyse comparative ad hoc. Il est une caractéristique utile.
wchargin
12

Lorsque vous passez la valeur via des arguments de ligne de commande, vous devez parcourir ces instructions suivantes. Les caractères suivants ont une signification particulière pour le shell lui-même dans certains contextes et peuvent devoir être échappés dans les arguments:

` Backtick (U+0060 Grave Accent)
~ Tilde (U+007E)
! Exclamation mark (U+0021)
# Hash (U+0023 Number Sign)
$ Dollar sign (U+0024)
& Ampersand (U+0026)
* Asterisk (U+002A)
( Left Parenthesis (U+0028)
) Right parenthesis (U+0029)
 (⇥) Tab (U+0009)
{ Left brace (U+007B Left Curly Bracket)
[ Left square bracket (U+005B)
| Vertical bar (U+007C Vertical Line)
\ Backslash (U+005C Reverse Solidus)
; Semicolon (U+003B)
' Single quote / Apostrophe (U+0027)
" Double quote (U+0022)
↩ New line (U+000A)
< Less than (U+003C)
> Greater than (U+003E)
? Question mark (U+003F)
  Space (U+0020)1
VJAYSLN
la source
3
Comment les échapper alors?
ilkkachu
3
\ - Échappé en utilisant la barre oblique inverse .EX:2 4 \{#,$,&,*} 5 6
VJAYSLN
8

C'est parce que vous utilisez un shshell de type similaire. Citez-le #ou échappez-le en utilisant \et cela fonctionnera.

Cela s'appelle un commentaire dans sh. Il provoque la suppression du #(espace-hachage) et de tout argument postérieur. Il est utilisé de manière similaire aux commentaires en C, où il est utilisé pour documenter le code.

Les chaînes commençant par $sont appelées variables dans sh. Si vous n'avez pas défini de variable, elle se développera en une chaîne vide.

Par exemple, tous ces éléments seraient des moyens valides de transmettre le #à votre application:

2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6

Et ce seraient des moyens valides de passer une chaîne commençant par $:

2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6

Veuillez noter que les variables à l'intérieur de "s sont toujours développées.

SS Anne
la source