Mi chiedevo come creare un file denominato come flag, ad esempio, se volessi creare una cartella denominata -a
, quali comandi farebbe il trucco?
Ho provato mkdir '-a'
, mkdir \-a
e nessuno dei due ha funzionato. Sono su Ubuntu.
Mi chiedevo come creare un file denominato come flag, ad esempio, se volessi creare una cartella denominata -a
, quali comandi farebbe il trucco?
Ho provato mkdir '-a'
, mkdir \-a
e nessuno dei due ha funzionato. Sono su Ubuntu.
Risposte:
Chiama il comando in questo modo:
mkdir -- -a
Ciò --
significa che le opzioni finiscono dopo, quindi -a
vengono interpretate letteralmente e non come un'opzione mkdir
. Troverete questa sintassi non solo in mkdir
, ma in qualsiasi utility conforme a POSIX tranne per echo
e test
. Dalla specifica :
L'argomento - dovrebbe essere accettato come delimitatore che indica la fine delle opzioni. Tutti gli argomenti seguenti devono essere trattati come operandi, anche se iniziano con il carattere '-'. L'argomento - non deve essere usato come opzione o come operando.
L'uso --
come protezione è consigliato per quasi tutte le azioni in cui hai a che fare con nomi di file e vuoi assicurarti che non infrangano il comando, ad esempio quando sposti i file in un ciclo potresti voler chiamare quanto segue, in modo che un file chiamato -i
isn ' t (in?) correttamente analizzato come opzione:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.c
come esempio solo leggermente inventato. Qualsiasi editor degno di nota dovrebbe essere in grado di salvare su un file chiamato -myfile.c
se lo chiedi, ma il compilatore C probabilmente non farà ciò che vuoi quando ti viene dato un tale elenco di opzioni.
cc
comando Michael di cui sopra, che ha l' -o
opzione per specificare il file di output.
for f in ./*; do...
piuttosto chefor f in *; do...
Il modo più semplice che dovrebbe funzionare con qualsiasi programma ragionevole è quello di utilizzare un nome di percorso relativo davanti al -
, ad esempio mkdir ./-a
creerà una directory chiamata -a
nella directory di lavoro corrente.
L'esempio più comune di utilizzo di questo "trucco" è quando si desidera rimuovere un file che inizia con un trattino, quindi è possibile farlo rm ./-a
.
./
è sempre una buona idea: immagina di aver creato un file chiamato -rf
e poi di averlo chiamato rm *
.
--
non è compreso da tutti i comandi, solo alcuni)
--
fosse una cosa bash, quindi dovrebbe funzionare per tutti i programmi?
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 (probabilmentebash
) di dare loro un significato speciale. Dal momento -a
che non significa nulla di speciale per la shell, questi non hanno alcun effetto sul modo in cui viene passatomkdir
.
Per quanto mkdir
riguarda, riceve un elenco di argomenti dalla shell e non è in grado di dire se li metti tra virgolette o meno, o se c'è stata una barra rovesciata. Vede solo una discussione -a
. Ecco perché hai bisogno di --
come spiegato nelle altre risposte.
Oltre alla risposta di "slhck" c'è un altro trucco che a volte funziona:
Metti il nome del file in questione entro 2 set di (diversi) qoutes come "'-a'"
o'"-a"'
.
Se funziona o meno dipende dal programma, ma è l'ultima risorsa se il programma non supporta la --
funzione POSIX .
Il metodo POSIX è sempre preferito in quanto affidabile al 100%.
--
per terminare l'elaborazione delle opzioni presuppone inoltre che non sia necessaria alcuna opzione per seguire il nome del file, il che non è sempre il caso.
'-a'
o "-a"
, almeno su sistemi di tipo BSD