Come creare un file che è chiamato come un argomento della riga di comando?


29

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 \-ae nessuno dei due ha funzionato. Sono su Ubuntu.


13
Le risposte qui sono tutte fantastiche, ma non riesco a pensare a un motivo non troll per voler fare questo ...
malesoup,

@evilsoup Ad alcune persone piace aggiungere un prefisso alle cartelle in modo che rimangano in cima a una lista ordinata in ordine alfanumerico. Ma questa è l'unica ragione a cui riesco a pensare, a dire il vero.
Slhck,

@slhck Conosco almeno un corso di editing video in cui incoraggiano gli studenti ad aggiungere spazi vuoti alle directory dei loro progetti in modo che si presentino in alto sugli iMac comuni. Questo è stato brutto e ha portato a un'escalation esilarante, ma almeno non avrebbe potenzialmente rotto il sistema ...
evilsoup,

3
Principalmente questo è qui per interesse accademico.
MYV,

Risposte:


49

Chiama il comando in questo modo:

mkdir -- -a

Ciò --significa che le opzioni finiscono dopo, quindi -avengono interpretate letteralmente e non come un'opzione mkdir. Troverete questa sintassi non solo in mkdir, ma in qualsiasi utility conforme a POSIX tranne per echoe 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 -iisn ' t (in?) correttamente analizzato come opzione:

mv -- "$f" new-"$f"

L'aspetto negativo di questo approccio è proprio che termina l'elaborazione delle opzioni. Per un semplice esempio di mkdir, questo fa miracoli; se hai effettivamente bisogno di un'opzione per seguire il nome del file sulla riga di comando, non funzionerà affatto.
un CVn

1
Certo, c'è un aspetto negativo in tutto. Nei casi in cui hai a che fare con nomi di file intervallati da opzioni, la soluzione di Amos sarebbe l'unica alternativa sana che mi viene in mente, ma dipende davvero da come lo strumento analizza le opzioni.
Slhck,

1
Dato che l'OP parla della creazione di un file con un nome "come un argomento da riga di comando" (supponiamo che significhi un nome che inizia con un trattino), non penso che sia un presupposto del tutto irragionevole. Prendi cc -o -myfile -Wall -myfile.ccome esempio solo leggermente inventato. Qualsiasi editor degno di nota dovrebbe essere in grado di salvare su un file chiamato -myfile.cse lo chiedi, ma il compilatore C probabilmente non farà ciò che vuoi quando ti viene dato un tale elenco di opzioni.
un CVn

1
@Maksim Ad esempio i comandi che richiedono un'opzione per impostare un nome file di input o output, come il cccomando Michael di cui sopra, che ha l' -oopzione per specificare il file di output.
Slhck,

1
L'esempio del loop è il motivo per cui dovresti sempre usare qualcosa del genere for f in ./*; do... piuttosto chefor f in *; do...
evilsoup,

21

Il modo più semplice che dovrebbe funzionare con qualsiasi programma ragionevole è quello di utilizzare un nome di percorso relativo davanti al -, ad esempio mkdir ./-acreerà una directory chiamata -anella 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.


3
Ciò ovviamente funziona solo se si lavora con percorsi di file e non con opzioni di riga di comando arbitrarie analizzate come stringhe. Ma altrimenti il ​​prefisso ./è sempre una buona idea: immagina di aver creato un file chiamato -rfe poi di averlo chiamato rm *.
Slhck,

1
@slhck Per molte persone che potrebbero sembrare uno scherzo. Ma ho visto abbastanza casi in cui questo genere di cose ha spazzato via (parte di) un server. Non puoi avvisare abbastanza le persone dei pericoli dei file che iniziano con un trattino. Un posto in cui ho lavorato lo aveva anche come regola ufficiale: non creare mai un file il cui nome inizia con "-f" o "-r".
Tonny,

1
Questa dovrebbe essere la risposta: è l'unico modo portatile ( --non è compreso da tutti i comandi, solo alcuni)
Olivier Dulac,

@OlivierDulac Ho pensato che --fosse una cosa bash, quindi dovrebbe funzionare per tutti i programmi?
gsingh2011,

@ gsingh2011 no, il codice che decide se "-" è considerato un marker "end of flags" residente nell'applicazione e spetta a ciascuna applicazione decidere se la tratta in questo modo.
Amos Shapira,

4

Il motivo per cui mkdir '-a', o mkdir \-anon 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 -ache non significa nulla di speciale per la shell, questi non hanno alcun effetto sul modo in cui viene passatomkdir .

Per quanto mkdirriguarda, 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.


-3

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%.


"Il metodo POSIX è sempre preferito in quanto affidabile al 100%." L'uso --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.
un CVn

@ MichaelKjörling Certo ... Ma ho ipotizzato che sarebbe ovvio.
Tonny,

4
Questo creerà un file chiamato '-a'o "-a", almeno su sistemi di tipo BSD
nohillside,

4
Può citare un OS / shell in cui questo fa il lavoro?
Nohillside,

1
se funzionasse, sembrerebbe che avresti un problema piuttosto significativo nel gestire file con nomi racchiusi tra virgolette.
muhmuhten,
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.