Não foi possível transmitir o caractere '#' como argumento da linha de comando

36

Não consigo passar strings começando com #argumentos de linha de comando.

Aqui está um teste simples:

#include <stdio.h>

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

    putchar('\n');

    return 0;
}

Se eu inserir os argumentos da seguinte maneira:

2 4 # 5 6

O valor de argcé 3e não 6. Ele lê #e pára por aí. Não sei por que e não consigo encontrar a resposta em minhas cópias da linguagem de programação C e do C Primer Plus .

cd-00
fonte
44
o destaque de sintaxe em StackOverflow ilustra o seu problema muito bem :)
Brad Allred

Respostas:

47

#começa um comentário em shells Unix, como //em C.

Isso significa que quando o shell passa os argumentos para o programa, ele ignora tudo após o #. Escapá-lo com uma barra invertida ou aspas significa que ele é tratado como os outros parâmetros e o programa deve funcionar conforme o esperado.

2 4 \# 5 6

ou

2 4 '#' 5 6

ou

2 4 "#" 5 6

Observe que o #caractere é um comentário apenas no início de uma palavra, portanto, isso também deve funcionar:

2 4#5 6
fanduin
fonte
2
Esta parece ser uma boa lista bastante unix.stackexchange.com/a/270979
fanduin
22
@ cd-00 Você precisa aprender como o shell funciona. Isso não tem nada a ver com o seu código C.
chepner
3
Ah, para que você possa digitar comentários em sessões interativas do shell, para que o shell possa ignorá-lo imediatamente após terminar de digitar. Que recurso útil.
Joker_vD 13/11/19
6
@Joker_vD Enquanto você pensa em um shell como uma interface de linha de comando, na verdade é um interpretador de scripts. O fato de poder usá-lo como uma CLI interativa é um bônus interessante. Por que o interpretado deve se comportar de maneira significativamente diferente quando você está "executando um script" versus digitando comandos de maneira interativa? Que tal echo echo Hello, World | bash. Isso é interativo? Ou talvez bash <<END?
Christopher Schultz
6
@Joker_vD: Eu costumo digitar comentários em sessões interativas para consultar novamente no meu histórico de shell. Às vezes, isso é para gravar um hash de confirmação ou outro ID emitido no stdout; às vezes é notar que um comando falhou como uma nota para o meu eu futuro; às vezes, é para registrar dados de tempo para comparações ad hoc. Ele é um recurso útil.
wchargin
12

Ao passar o valor pelos argumentos da linha de comando, você deve seguir estas instruções a seguir. Os seguintes caracteres têm um significado especial para o próprio shell em alguns contextos e podem precisar ser ignorados nos argumentos:

` 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
fonte
3
Como eles deveriam escapar então?
Ilkkachu
3
\ - Escapou usando a barra invertida .EX:2 4 \{#,$,&,*} 5 6
VJAYSLN
8

É porque você está usando um shshell semelhante. Cite #ou escape usando \e ele funcionará.

Isso é chamado de comentário em sh. Isso faz com que o #(hash de espaço) e quaisquer argumentos depois sejam descartados. É usado de maneira semelhante aos comentários em C, onde é usado para documentar o código.

Sequências começando com $são chamadas de variáveis em sh. Se você não definiu uma variável, ela será expandida para uma sequência vazia.

Por exemplo, todas essas seriam maneiras válidas de passar #para o seu aplicativo:

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

E essas seriam maneiras válidas de passar uma string começando com $:

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

Observe que as variáveis ​​dentro de "s ainda são expandidas.

SS Anne
fonte