Impossibile passare il carattere '#' come argomento della riga di comando


36

Non riesco a passare le stringhe che iniziano #come argomenti da riga di comando.

Ecco un semplice test:

#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 inserisco gli argomenti come segue:

2 4 # 5 6

Il valore di argcè 3e non 6. Legge #e si ferma lì. Non so perché e non riesco a trovare la risposta nelle mie copie di The C Programming Language e C Primer Plus .


44
l'evidenziazione della sintassi su StackOverflow illustra bene il tuo problema :)
Brad Allred

Risposte:


47

#inizia un commento nelle shell Unix, proprio come //in C.

Ciò significa che quando la shell passa gli argomenti al programma, ignora tutto ciò che segue il #. L'escape con una barra rovesciata o virgolette significa che viene trattato come gli altri parametri e il programma dovrebbe funzionare come previsto.

2 4 \# 5 6

o

2 4 '#' 5 6

o

2 4 "#" 5 6

Nota che #è un carattere di commento solo all'inizio di una parola, quindi dovrebbe funzionare anche:

2 4#5 6

2
Questa sembra essere una lista abbastanza buona unix.stackexchange.com/a/270979
fanduin

22
@ cd-00 Devi imparare come funziona la shell. Questo non ha nulla a che fare con il tuo codice C.
Chepner,

3
Ah, quindi puoi digitare i commenti nelle sessioni interattive della shell, in modo che la shell possa ignorarlo immedait dopo aver finito di digitarlo. Che caratteristica utile.
Joker_vD

6
@Joker_vD Mentre pensi a una shell come a un'interfaccia a riga di comando, in realtà è un interprete di script. Il fatto che sia possibile utilizzarlo come una CLI interattiva è un bel vantaggio. Perché l'interpretazione dovrebbe comportarsi in modo significativamente diverso quando si "esegue uno script" rispetto alla digitazione interattiva dei comandi? Che dire echo echo Hello, World | bash. È interattivo? O forse bash <<END?
Christopher Schultz,

6
@Joker_vD: scrivo spesso commenti in sessioni interattive a cui fare riferimento nella mia cronologia della shell. A volte questo serve per registrare un hash di commit o un altro ID emesso su stdout; a volte è da notare che un comando non è riuscito come nota per il mio io futuro; a volte è per registrare i dati di temporizzazione per benchmarking ad hoc. Si tratta di una funzione utile.
wchargin,

12

Quando si passa il valore attraverso gli argomenti della riga di comando, è necessario seguire queste istruzioni. I seguenti caratteri hanno un significato speciale per la shell stessa in alcuni contesti e potrebbe essere necessario sfuggire agli argomenti:

` 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
Come dovrebbero essere sfuggiti allora?
ilkkachu,

3
\ - Escap utilizzando backslash .EX:2 4 \{#,$,&,*} 5 6
VJAYSLN

8

È perché stai usando una shshell simile. Cita #o scappa usando \e funzionerà.

Questo è chiamato un commento in sh. Causa #(spazio-hash) e tutti gli argomenti dopo che vengono scartati. È usato in modo simile ai commenti in C, dove è usato per documentare il codice.

Le stringhe che iniziano con $sono chiamate variabili in sh. Se non hai impostato una variabile, si espanderà in una stringa vuota.

Ad esempio, tutti questi sarebbero modi validi per passare #alla tua applicazione:

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

E questi sarebbero modi validi per passare una stringa che inizia con $:

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

Si noti che le variabili all'interno di "s sono ancora espanse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.