Come faccio a passare il carattere asterisco ‘*’ in bash come argomenti al mio programma C?

Diciamo che ho un programma in C e lo eseguo da bash:

$ ./a.out 123 * 

Il programma genererebbe tutti gli argomenti della riga di comando, ma mostrerà questi invece:

  Argomento 1: 123
 Argomento 2: a.out

Cosa posso fare nel mio programma per risolvere questo problema?

La shell sostituisce l’asterisco con il nome di ciascun file nella directory.

Per passare un asterisco letterale, dovresti essere in grado di evaderlo:

 $ ./a.out 123 \* 

Puoi citarla nella shell

 ./a.out 123 '*' 

Non c’è nulla che tu possa fare nel tuo programma, perché l’espansione * è fatta dalla shell (al contrario di Windows, dove viene eseguita dal programma).

Un’altra opzione è usare set -f per distriggersre l’espansione. Confrontare:

 echo * 

vs

 set -f echo * 

Questo non ha nulla a che fare con il tuo programma.

* È un jolly in Bash, significa “tutti i file nella directory corrente”. Se vuoi passare un asterisco come argomento al tuo programma, lo fai nello stesso modo in cui lo fai con ogni altro programma: lo sfuggi con una barra rovesciata o lo cito.

Un’altra alternativa è iniziare il tuo script con #!/bin/bash -f come prima riga, che ti permetterà di accettare stringhe letterali come argomenti (incluso l’asterisco), e quindi che ti permetteranno di eseguire ./a.out 123 * con l’input desiderato, ma nota che bash -f disabilita completamente le espansioni e che può avere effetti negativi nel tuo script a seconda di ciò che fai.