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.