Cosa fa uno <nudo?


10

bash non sembra lamentarsi se si esegue un comando come

$ < some-file-that-exists

Non sembra succedere nulla.

Puoi anche usare

$ <<<"any string"

e persino la sostituzione del processo.

Quindi, cosa fa esattamente questo e perché è permesso. Potrebbe essere utile per qualcosa?


A proposito: per il grande ZSH, "<foobar" è lo stesso di "less foobar", come il tuo foobar di reindirizzamento alla shell. Penso che questo sia un comportamento abbastanza intuitivo. Un nudo <ti darà un errore ( zsh: parse error near `\n') poiché non viene fornito alcun argomento.
matematica

@math otterrai un errore simile in bash, ma è interessante less.
Pillole di esplosione l'

Risposte:


20

<imposta il reindirizzamento per un comando che può verificarsi prima o dopo le istruzioni di reindirizzamento. ie

$ < file wc

funziona anche

$ wc < file

Ma se non dai un comando, bash imposta il reindirizzamento e non fa altro. Per il reindirizzamento dell'input, ciò equivale a quello che hai visto, niente, se il file esiste ed è leggibile. Se il file non esiste o non è leggibile, bash segnalerà un errore. Per il reindirizzamento dell'output, il file di output verrà creato se non esiste. Qualsiasi file di output esistente verrà troncato se >utilizzato; nessun troncamento se >>viene utilizzato.


in altre parole sono un conciso che esiste e creano
maniaco del cricchetto

@Kyle Jones Penso che tu abbia misurato i due operatori nell'ultima frase.
jamesbtate,

@Puddingfox Grazie. Ho modificato la frase di fine corsa per chiarire.
Kyle Jones,

C'è qualche motivo per usare < file wcvs. wc < file?
Esplosione di pillole

1
@tandu È utile quando si usano shell interattive. Supponi di avere un comando che utilizza il reindirizzamento e desideri ripeterlo con un ultimo argomento diverso. Se il reindirizzamento si trova all'inizio della riga, è facile digitare control-P e quindi modificare l'ultimo argomento senza saltare la lingua "<foo> bar 2> & 1" come se fosse alla fine. Oltre a ciò, non ne ho trovato alcuna utilità.
Kyle Jones,

5

<legge da stdin per impostazione predefinita o un file. la tua espressione non fa nulla con l'input perché non hai fatto nulla dopo aver letto.

se alla fine esegui <file-esistente-esistente>, vedrai che hai appena letto il contenuto del primo file e l'hai scritto nel secondo file.

<<< è qui in formato doc, quindi legge da una stringa anziché da un file. cat <<< "qualsiasi stringa" per vedere cosa hai letto.


2
per riferimento futuro, modifica la tua risposta per aggiungere dettagli invece di aggiungere un commento
Nate Koppenhaver,

2
"se si esegue <output-di-file-esistente> alla fine, si vedrà che hai appena letto il contenuto del primo file e l'hai scritto nel secondo file." Questo è sbagliato; senza un comando il file di output verrà troncato a zero byte.
Kyle Jones,
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.