it-swarm.it

Utilizzo del trattino (-) al posto di un nome file

Per un comando, se si utilizza - come argomento al posto del nome di un file significherà STDIN o STDOUT.

  1. Ma in questo esempio, crea un file con il nome -:

    echo hello > -
    

    Come posso creare - in questo esempio significa STDOUT?

  2. Al contrario, come posso fare - indica un file denominato - in esempi come:

    cat -
    
121
Tim

Utilizzando - come nome file per indicare stdin/stdout è una convenzione utilizzata da molti programmi. Non è una proprietà speciale del nome file. Il kernel non riconosce - come speciale, quindi qualsiasi chiamata di sistema fa riferimento a - come nome file utilizzerà - letteralmente come il nome del file.

Con reindirizzamento bash, - non è riconosciuto come un nome file speciale, quindi bash lo utilizzerà come nome file letterale.

Quando cat vede la stringa - come nome file, lo tratta come sinonimo di stdin. Per ovviare a questo, è necessario modificare la stringa che cat vede in modo tale da fare ancora riferimento a un file chiamato -. Il solito modo per farlo è quello di aggiungere il prefisso al nome del file con un percorso - ./-, o /home/Tim/-. Questa tecnica viene anche utilizzata per aggirare problemi simili in cui le opzioni della riga di comando si scontrano con i nomi dei file, quindi un file denominato ./-e non appare come -e opzione da riga di comando per un programma, ad esempio.

169
camh
  1. Invece di echo hello > -, Puoi usare echo hello > /dev/stdout.

    Mentre "-" è una convenzione che deve essere implementata da ciascun programma che desidera supportarlo, /dev/stdin, /dev/stdout e /dev/stderr sono, quando supportati dal sistema operativo (almeno Solaris, Linux e BSD), indipendenti dall'applicazione e quindi funzioneranno come previsto.

18
jlliagre

Come citato , - è solo una convenzione di denominazione utilizzata da alcuni programmi. Se si desidera fare riferimento a questi flussi con un descrittore di file che Shell riconoscerà, jiliagre era corretta nel fatto che si usi il nome /dev/stdin o /dev/stdout anziché. Quei nomi di file dovrebbero funzionare in qualsiasi posto in cui funzionerebbe un normale nome di file.

  1. Detto questo, il tuo primo esempio è un po 'sciocco. Qualsiasi output che verrebbe intercettato dall'operatore di reindirizzamento per scrivere su un file è già su output standard, quindi reindirizzarlo e riscriverlo da dove proviene è inutile. Il comportamento che usi lì è la pipe, non un reindirizzamento:

    echo hello |
    
  2. Nel tuo secondo esempio devi semplicemente dare qualche indicazione che vuoi un file di lettere con quel nome, non l'alias interno che ha. Puoi farlo più facilmente specificando un percorso al file come questo:

    cat ./-
    
10
Caleb

Per quanto riguarda 1, il programma deve supportarlo. Non puoi semplicemente usarlo arbitrariamente. Per quanto riguarda 2, reindirizzare l'input da (ad es. cat < -).

6
bahamat

L'approccio "-" presenta molti problemi. Innanzitutto richiede un'interpretazione del carattere "-" e molti programmi non eseguono tale interpretazione. Inoltre, ci sono alcuni programmi che interpretano un trattino come un delimitatore che segna la fine delle opzioni della riga di comando. I programmi sono scritti per funzionare con argomenti di nome file, l'approccio '-' è un hack, bello ma debole.

Il modo migliore è:

$ echo hello > /dev/fd/1

/dev/stdout è un link symbolik di /dev/fd/1

1
b3h3m0th

I personaggi speciali hanno principalmente due significati:

Grafico numerico ASCII.

Scripting o simbolico.

È possibile che un singolo carattere rappresenti una stringa o funga da stringa. come la mia comprensione.

in linguaggio C la funzione fopen() accetta due argomenti: il primo flusso di file e la seconda modalità in cui il file sarà aperto. la modalità è una stringa. anche se è un singolo personaggio.

cat> "-" funziona.

0
Owais Qureshi