Perché `sort <“ $ f1 ”` è preferito su `sort -“ $ f1 ”`, e perché è preferito su `sort“ $ f1 ”`?


29

Da /unix//a/458074/674

Ricorda di usare -- quando passi argomenti arbitrari ai comandi (o usa i reindirizzamenti ove possibile). Così sort -- "$f1"o meglio sort < "$f1"invece di sort "$f1".

Perché si preferisce utilizzare --e reindirizzare?

Perché è sort < "$f1"preferito rispetto sort -- "$f1"?

Perché è sort -- "$f1"preferito rispetto sort "$f1"?

Grazie.


Risposte:


55
sort "$f1"

non riesce per i valori $f1che iniziano con -o qui per il caso di sortalcuni che iniziano con +(può avere gravi conseguenze per un file chiamato -o/etc/passwdad esempio).

sort -- "$f1"

(dove -- segnala la fine delle opzioni) risolve la maggior parte di questi problemi, ma non riesce ancora per il file chiamato -(che invece sortinterpreta il significato di stdin).

sort < "$f1"

Non ha questi problemi.

Qui è la shell che apre il file. Significa anche che se non è possibile aprire il file, verrà visualizzato anche un messaggio di errore potenzialmente più utile (ad esempio, la maggior parte delle shell indicherà il numero di riga nello script) e il messaggio di errore sarà coerente se si utilizza reindirizzamenti ove possibile per aprire i file.

E dentro

sort < "$f1" > out

(contrariamente a sort -- "$f1" > out), se "$f1"non può essere aperto, outnon verrà creato / troncato e sortnemmeno eseguito.

Per cancellare un po 'di confusione (seguendo i commenti seguenti), ciò non impedisce al comando di mmap()inserire il file o lseek()ing al suo interno (e nemmeno quello sort) a condizione che il file stesso sia ricercabile. L'unica differenza è che il file viene aperto in precedenza e sul descrittore di file 0 dalla shell, anziché in seguito dal comando eventualmente su un descrittore di file diverso. Il comando può ancora cercare / mmap che fd 0 come preferisce. Ciò non deve essere confuso con il punto in cat file | cmdcui lo cmdstdin di questa volta è un tubo che non può essere mmaped / cercato.


4
Basta ricordare che l'uso di un reindirizzamento forza la sortlettura sequenziale dei dati e non è possibile mmapil file. Anche se sortpotrebbe non avere molti problemi con esso, considera le prestazioni di less <filee less file. Nel primo caso lessdeve conservare l'intero contenuto del file in memoria, nel secondo caso è consentito leggere solo quelle parti che desidera. Ora immagina che filesia un file di registro da 100 GB ...
polistirolo vola il

7
@styrofoamfly: è corretto che less <filemantiene tutti i file in memoria, ma non è forzato, questo è un difetto di meno. Solo cat file | lessè costretto a farlo. Dai un'occhiata less /dev/fd/0 <f, che non mantiene il file in memoria, anche se lo riceve su stdin. È un'idea sbagliata comune che lo stdin in Unix non sia ricercabile. In effetti, può essere ricercabile, a seconda del tipo di file.
punti

@styrofoamfly Vuoi dire che read()leggi i dati in sequenza da un file, mentre mmap()leggi l'intero file in memoria contemporaneamente?
Tim

1
@JohnBollinger No. Risale almeno al 1980 dal SysIII prima dell'inizio del progetto GNU e deve essere supportato per la maggior parte delle utility standard, incluso sortPOSIX. Ma è vero che non è sempre supportato.
Stéphane Chazelas,

2
Mi scuso, @ StéphaneChazelas, hai ragione sull'origine della convenzione e stabilirò inoltre che la specifica POSIX per la getopt()funzione C riconosce questo significato dell'argomento --. Ma il punto principale è quello che accetti: la gestione degli argomenti è il dominio dei singoli programmi e non tutti trattano in modo --speciale.
John Bollinger,

17

Il problema sono i nomi di file che iniziano con un trattino. sort "$f1"non funziona se il valore di f1inizia con -perché il comando interpreterà il valore come opzione. Questo di solito si traduce in un errore, ma potrebbe persino causare una falla nella sicurezza . Con sort -- "$f1", l'argomento doppio trattino --significa "nessuna opzione oltre questo punto", quindi il valore di f1non verrà interpretato come un'opzione. Ma c'è ancora un caso limite: se il valore di f1è un trattino e nient'altro, allora non è un'opzione, è l'argomento -, che significa "input standard" (perché l'argomento è un file di input; per un file di output significherebbe "output standard").

L'uso del reindirizzamento evita tutte queste insidie.

Questo vale per la maggior parte dei comandi, non solo sort.


Stai dicendo che sort < "$f1"funzionerebbe se il valore fosse uguale a -? In nessuna shell ho provato.
Grawity,

@grawity, confronta seq 10 > -; sort -con seq 10 > -; sort < -.
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.