Per un comando, se si utilizza -
come argomento al posto del nome di un file significherà STDIN o STDOUT.
-
Ma in questo esempio, crea un file con il nome
-
:echo hello > -
Come posso fare in modo che
-
in questo esempio significhi STDOUT? -
Al contrario, come posso fare in modo che
-
significhi un file denominato-
in esempi come:cat -
Commenti
Risposta
Lutilizzo di -
come nome di file per indicare stdin / stdout è una convenzione utilizzata da molti programmi. Non è una proprietà speciale del nome del file. Il kernel non riconosce -
come speciale, quindi qualsiasi chiamata di sistema che fa riferimento a -
come nome di file utilizzerà -
letteralmente come nome del file.
Con il reindirizzamento bash, -
non è riconosciuto come un nome file speciale, quindi bash lo userà come nome file letterale.
Quando cat
vede la stringa -
come un nome di file, la tratta come un sinonimo di stdin. Per aggirare questo problema, è necessario modificare la stringa che cat
vede in modo che faccia ancora riferimento a un file chiamato -
. Il modo usuale per farlo è anteporre al nome del file un percorso: ./-
o /home/Tim/-
. Questa tecnica viene utilizzata anche per aggirare problemi simili in cui le opzioni della riga di comando sono in conflitto con i nomi dei file, quindi un file denominato ./-e
non viene visualizzato come -e
opzione della riga di comando per un programma, ad esempio.
Commenti
- It ‘ s vale la pena aggiungere che
/dev/stdin
e/dev/stdout
sono universalmente disponibili e possono essere utilizzati al posto di-
convenzione. - @jmtd: / dev / std {in, out} non sono universalmente disponibili. Non tutti gli Unix ce lhanno.
- Interessante, ho pensato che facessero parte di POSIX (ma non posso ‘ confermare). ‘ sono presenti almeno su Linux, BSD e Solaris. Puoi fare un esempio di un UNIX moderno a cui mancano?
- @camh Non sei sicuro di aver ricevuto la notifica, e questo è un argomento molto, molto vecchio; ‘ non sono sicuro che tu possa farlo, ma ‘ sono molto curioso di sapere la risposta a
jmtd
‘ s domanda? 🙂 - @jmtd Mi sembra di aver trovato una risposta provvisoria alla domanda: unix.stackexchange.com/a/278368/31669
Rispondi
-
Invece di
echo hello > -
, puoi utilizzareecho hello > /dev/stdout
.Mentre “-” è una convenzione che deve essere implementata da ogni programma che desidera supportarla,
/dev/stdin
,/dev/stdout
e/dev/stderr
sono, se supportati dal sistema operativo (almeno Solaris, Linux e BSD lo fanno) , indipendentemente dallapplicazione e quindi funzionerà come desideri.
Rispondi
Come camh menzionato , -
è solo una convenzione di denominazione utilizzata da alcuni programmi.Se desideri fare riferimento a questi flussi con un descrittore di file che la shell riconoscerà, jiliagre aveva ragione nel farti utilizzare il nome /dev/stdin
o /dev/stdout
invece. Quei nomi di file dovrebbero funzionare ovunque funzionerebbe un normale nome di file.
-
Detto questo, il tuo primo esempio è piuttosto sciocco. Qualsiasi output che sarebbe catturato dalloperatore di reindirizzamento per scrivere su un file è già ON standard output, quindi reindirizzarlo e riscriverlo da dove proviene è inutile. Il comportamento che usi lì è la pipe, non un reindirizzamento:
echo hello |
-
Nel tuo secondo esempio devi semplicemente fornire alcune lattine indica che vuoi un file letterale con quel nome, non lalias interno che ha. Puoi farlo in modo più semplice specificando un percorso al file come questo:
cat ./-
Risposta
Quanto a 1, il programma deve supportarlo. Non puoi usarlo arbitrariamente. Per quanto riguarda 2, reindirizza linput da (ad esempio, cat < -
).
Risposta
Lapproccio “-” ha molti problemi. Prima di tutto richiede uninterpretazione del carattere “-” e molti programmi non eseguono tale interpretazione. Inoltre, ci sono alcuni programmi che interpretano un trattino come un delimitatore che contrassegna la fine delle opzioni della riga di comando. I programmi sono scritti per funzionare con gli argomenti del nome del file, lapproccio “-” è un trucco, carino ma debole.
Il modo migliore è:
$ echo hello > /dev/fd/1
/dev/stdout
è un collegamento simbolico di /dev/fd/1
Commenti
- Il reindirizzamento è interpretato dalla shell, non dal programma richiamato.
Risposta
I caratteri speciali hanno principalmente due significati:
Grafico numerico ASCII.
Script o simbolico.
È possibile che un singolo carattere rappresenti una stringa o agisca come una stringa. Come da me.
in linguaggio C fopen()
la funzione accetta due argomenti: il primo flusso di file e la seconda modalità in cui il file verrà aperto. la modalità è una stringa. anche se è un singolo carattere.
cat > ” – ” funziona.
2>&-
costruzione, che significa ” chiudi descrittore 2 “.