Chiama il comando in questo modo:
mkdir -- -a
Il --
significa che le opzioni terminano dopo, quindi il -a
viene interpretato letteralmente e non come un'opzione di mkdir
. Troverai questa sintassi non solo in mkdir
, ma qualsiasi utility conforme a POSIX tranne echo
e test
. Dalla specifica:
L'argomento -- dovrebbe essere accettato come delimitatore che indica la fine delle opzioni. Tutti gli argomenti successivi devono essere trattati come operandi, anche se iniziano con il carattere '-'. L'argomento -- non dovrebbe essere usato come opzione o come operando.
Usando --
come protezione è consigliato per quasi tutte le azioni in cui si ha a che fare con nomi di file e si desidera assicurarsi che non interrompano il comando, ad es. quando sposti i file in un ciclo potresti voler chiamare quanto segue, in modo che un file chiamato -i
non è (in?)correttamente analizzato come opzione:
mv -- "$f" new-"$f"
Il modo più semplice che dovrebbe funzionare con qualsiasi programma ragionevole è utilizzare un nome di percorso relativo davanti a -
, per esempio. mkdir ./-a
creerà una directory chiamata -a
nella directory di lavoro corrente.
L'esempio più comune di utilizzo di questo "trucco" è quando vuoi rimuovere un file che inizia con un trattino, quindi puoi fare rm ./-a
.
Il motivo per cui mkdir '-a'
o mkdir \-a
non funziona è perché entrambi questi metodi (usando virgolette o barre rovesciate) sono usati per prevenire la tua shell (probabilmente bash
) dal dare loro un significato speciale. Da -a
non significa niente di speciale per la shell comunque, questi non hanno alcun effetto su come viene passato a mkdir
.
Fino a mkdir
è preoccupato, riceve un elenco di argomenti dalla shell e non può dire se li hai inseriti tra virgolette o meno, o se c'era una barra rovesciata. Vede solo un argomento -a
. Ecco perché ti serve il --
come spiegato nelle altre risposte.