web-dev-qa-db-fra.com

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

Je ne peux pas transmettre 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 argc est 3 et pas 6. Ça 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.

36
cd-00

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

Cela signifie que lorsque le shell transmet 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 # n'est un caractère de commentaire qu'au début d'un Word, donc cela devrait également fonctionner:

2 4#5 6
47
fanduin

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
12
VJAYSLN

C'est parce que vous utilisez un shell semblable à sh. Citez le # ou échappez-vous en utilisant \ et cela fonctionnera.

C'est ce qu'on appelle un commentaire dans sh. Il provoque le # (espace-hachage) et tous les arguments suivants à supprimer. Il est utilisé de manière similaire aux commentaires en C, où il est utilisé pour documenter le code.

Chaînes commençant par $ sont appelés 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 passer le # à votre candidature:

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 encore développés.

8
S.S. Anne