No se puede pasar el carácter '#' como argumento de línea de comando


36

No puedo pasar cadenas que comiencen #como argumentos de línea de comandos.

Aquí hay una prueba 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 ingreso los argumentos de la siguiente manera:

2 4 # 5 6

El valor de argces 3y no 6. Se lee #y se detiene allí. No sé por qué, y no puedo encontrar la respuesta en mis copias de The C Programming Language y C Primer Plus .


44
el resaltado de sintaxis en StackOverflow ilustra muy bien su problema :)
Brad Allred

Respuestas:


47

#comienza un comentario en shells de Unix, al igual que //en C.

Esto significa que cuando el shell pasa los argumentos al programa, ignora todo lo que sigue al #. Escaparlo con una barra diagonal inversa o comillas significará que se trata como los otros parámetros y que el programa debería funcionar como se esperaba.

2 4 \# 5 6

o

2 4 '#' 5 6

o

2 4 "#" 5 6

Tenga en cuenta que #es un carácter de comentario solo al comienzo de una palabra, por lo que esto también debería funcionar:

2 4#5 6

2
Esta parece ser una lista bastante buena unix.stackexchange.com/a/270979
fanduin

22
@ cd-00 Necesita aprender cómo funciona el shell. Esto no tiene nada que ver con tu código C.
chepner

3
Ah, entonces puede escribir comentarios en sesiones de shell interactivas , para que el shell pueda ignorarlo inmediatamente después de que haya terminado de escribirlo. Que característica tan útil.
Joker_vD

66
@Joker_vD Si bien piensas en un shell como una interfaz de línea de comandos, en realidad es un intérprete de guiones. El hecho de que pueda usarlo como una CLI interactiva es una buena ventaja. ¿Por qué el interpretado debe comportarse de manera significativamente diferente cuando está "ejecutando un script" en lugar de escribir comandos de forma interactiva? ¿Qué pasa con echo echo Hello, World | bash. ¿Eso es interactivo? O tal vez bash <<END?
Christopher Schultz el

66
@Joker_vD: con frecuencia escribo comentarios en sesiones interactivas para consultar en mi historial de shell. A veces, esto es para registrar un hash de confirmación u otra ID emitida a stdout; a veces es para notar que un comando falló como una nota para mi futuro yo; a veces es para registrar datos de tiempo para evaluación comparativa ad hoc. Se es una característica útil.
wchargin

12

Al pasar el valor a través de los argumentos de la línea de comandos, debe seguir estas instrucciones. Los siguientes caracteres tienen un significado especial para el shell en algunos contextos y es posible que se deban escapar en 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

3
¿Cómo deberían escapar entonces?
ilkkachu

3
\ - Escapó usando la barra invertida .EX:2 4 \{#,$,&,*} 5 6
VJAYSLN

8

Es porque estás usando un shshell similar. Cita #o escapa usando \y funcionará.

Esto se llama un comentario en sh. Hace #que se descarte el (espacio-hash) y cualquier argumento posterior. Se usa de manera similar a los comentarios en C, donde se usa para documentar el código.

Las cadenas que comienzan con $se denominan variables en sh. Si no ha establecido una variable, se expandirá a una cadena vacía.

Por ejemplo, todas estas serían formas válidas de pasar el #a su aplicación:

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

Y estas serían formas válidas de pasar una cadena que comience con $:

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

Tenga en cuenta que las variables dentro de "s todavía se expanden.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.