Come "meno" un file chiamato "-"?


17

Ho accidentalmente creato un file con il nome -(ad es seq 10 > -.). Quindi ho provato a usarlo lessper visualizzarlo, ma si blocca e basta.

Capisco che ciò sta accadendo perché si less -aspetta input da stdin, quindi non interpreta il -nome del file. Ho provato less \-ma non funziona neanche.

Quindi, c'è un modo per indicare lessche -è un file e non stdin?

Il meglio che potrei ottenere è:

find -name '-' -exec less {} +

2
@muru, grazie per il commento, ma il possibile duplicato è così specifico che non credo si qualifichi come "duplicato esatto". Se è stato riformulato in qualcosa di più generico come "come accedere a un file che inizia con '-'", forse.
fedorqui,

4
Questa non è una domanda duplicata. Il caso da -solo è diverso. -non è un'opzione.
Stéphane Chazelas,

1
@terdon Non penso che avere la stessa risposta direttamente significhi che sono duplicati. C'era un esempio da qualche parte in Meta SO: se una domanda riceve una risposta con "No", qualsiasi cosa la cui risposta corretta è "No" sarebbe un duplicato? Come ho detto prima, sarebbe interessante riformulare il candidato del duplicato in modo che sia più generico; altrimenti, non ha molto senso inviare lì altre domande come questa.
fedorqui,

4
@terdon, no. La soluzione accettata non funzionerà qui. E no, -non è trattato come un'opzione, è un problema completamente diverso dal caso degli argomenti che sembrano essere modellati come opzioni.
Stéphane Chazelas,

2
Non è necessario racchiuderlo -tra virgolette singole '-'o sfuggirlo come \-perché -non è un carattere speciale per le shell comuni (almeno quelle compatibili con POSIX). Il risultato è lo stesso.
pabouk,

Risposte:


53

Basta prefissarlo con ./:

less ./-

O usa il reindirizzamento:

less < -

Si noti che poiché -(al contrario -xo --foo--per esempio) è considerato un nome file speciale anziché un'opzione, non funziona quanto segue:

less -- -   # THIS DOES NOT WORK

3
A proposito, questo è ciò che find -name '-' -exec less {} +funziona.
Stéphane Chazelas,

6
@fedorqui, no è solo quello -e ./-(o /path/to/-o ../to/-) sono due (4) percorsi validi per quel -file, ma un -argomento è speciale per less(significa letto da stdin) mentre ./-non è speciale.
Stéphane Chazelas,

2
@fedorqui find -name '-' -exec less {} +è il modulo non standard per find . -name '-' -exec less {} +. Discende l'albero in .e trova i file e passa i percorsi di quei file come argomenti a less. Sostituisci -exec lesscon -exec echo lessper vedere cosa viene eseguito.
Stéphane Chazelas,

4
@haylem, --è per segnare la fine delle opzioni. Non sarà d'aiuto qui. Questa -non è un'opzione, è un argomento speciale non opzionale. Vedi anche unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas,

3
@haylem, provalo tu stesso. --è gestito da getopt () per contrassegnare la fine delle opzioni, -non è riconosciuto come opzione da getopt (), quindi -verrà riconosciuto come argomento normale indipendentemente dal fatto che --sia fornito o meno. E come un normale argomento, lesscome la maggior parte delle utility di testo lo tratterà come significato stdin, che non vogliamo qui.
Stéphane Chazelas,


3

Nota: la mia risposta NON è valida nel caso del PO, e si applica solo agli strumenti che seguono la convenzione menzionata di seguito e non nel caso di un file chiamato esattamente solo -(trattino), che è spesso anche un caso speciale per specificare quella lettura dallo standard è previsto un input. Vedi la risposta accettata

Lasciandolo qui perché contiene informazioni utili per altri casi su cui ci si può imbattere durante la ricerca di risposte.


Double-Dash it!

Utilizzare la --convenzione standard doppio trattino ( ) per indicare l'ultimo argomento:

less -- -FILENAME

Esempio

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

Whhhaattt?

Questo --argomento deriva da una convenzione supportata dalla maggior parte delle implementazioni delle utilità della shell e degli strumenti da riga di comando e la maggior parte delle shell sosterrà visibilmente la necessità di seguirla quando si implementano gli strumenti CLI.

Raccomandato da Open Group

OpenGroup lo menziona anche nella sezione Impostazioni predefinite descrizione utilità (v6) delle specifiche di base:

Comportamento predefinito: le [...] utility standard che non accettano opzioni, ma che accettano operandi, riconoscono "-" come primo argomento da scartare.

Il requisito per riconoscere "-" è perché le applicazioni conformi hanno bisogno di un modo per proteggere i loro operandi da eventuali opzioni arbitrarie che l'implementazione può fornire come estensione. Ad esempio, se l'utilità standard foo è elencata come non prendendo opzioni e l'applicazione doveva assegnarle un nome percorso con un trattino iniziale, potrebbe farlo in modo sicuro come:

foo -- -myfile

ed evitare qualsiasi problema con -m usato come estensione.

E nelle Linee guida per la sintassi dell'utilità (v7):

Linea guida 10: Il primo argomento che non è un argomento opzione 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 '-'.

Consigliato da Bash

Qui, estratto dal manuale di bash, sui suoi builtin che lo supportano:

Salvo diversamente specificato, ciascun comando incorporato documentato in questa sezione come accettazione delle opzioni preceduto da - accetta - per indicare la fine delle opzioni.

I builtin:, true, false e test non accettano opzioni e non trattano - specialmente. Exit, logout, break, continue, let e shift builtin accettano ed elaborano argomenti che iniziano con - senza richiedere -. Altri builtin che accettano argomenti ma che non sono specificati come opzioni di accettazione interpretano argomenti che iniziano con - come opzioni non valide e richiedono - per impedire questa interpretazione.

Nota che l'eco non interpreta - per indicare la fine delle opzioni.

Letture addizionali


2
+1: La soluzione più portatile e indipendente dai comandi, facile da ricordare e considerata la "migliore pratica"
mveroone,

2
@Kwaio qualche riferimento sulla "migliore pratica"? Sentiti curioso a riguardo.
fedorqui,

24
Questa risposta si applica agli argomenti che sembrano opzioni. Non è il caso per il -quale non è un'opzione. L'uso ./-o il reindirizzamento quando possibile è generalmente un approccio migliore in quanto evita altri tipi di problemi come il foo=barof awko quello -. Vedi anche unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas,

7
Come dice Stéphane, questo non risponde alla domanda. less -- -proverò comunque a leggere da stdin.
Michał Politowski,

5
Potresti voler eliminare la risposta (o spostarla sull'altra domanda in quanto vi sono riferimenti utili qui) o chiarire che non si applica a questo caso particolare (e forse spiegare perché quale sarebbe ancora più utile).
Stéphane Chazelas,
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.