qual è la differenza tra `>> / dev / stderr` (con lo spazio bianco) e`> & 2`?


11

In bash.

Sto avendo qualche difficoltà a determinare cosa dovrei usare?

tutti i miei script usano ">> / dev / stderr"

al prompt di bash, se provo:
echo test >>/dev/stderrfunziona
echo test >> /dev/stderrfunziona
echo test >/dev/stderrfunziona
echo test > /dev/stderrfunziona

echo test >>&2NON RIESCE!
echo test >> &2NON RIESCE!
echo test >&2funziona
echo test > &2GUASTI!

Sono disposto a cambiare tutti i miei script in >&2.

Sembra avere anche un grande effetto su ssh (after su SomeUser) dove >>/dev/stderrnon funzionerà affatto (permesso negato), funzionerà solo >&2.


puoi mostrare un esempio dell'errore ssh? Non riesco a riprodurlo.
Jeff Schaller

@JeffSchaller hai ragione, è solo dopo suche si verifica il problema, ha aggiornato la domanda
Aquarius Power il

@AquariusPower, ... per spiegare questa discrepanza, tra l'altro: con su -c 'some command', quel comando viene eseguito /bin/sh, non bash, quindi /dev/stderrnon è garantito che sia presente un comportamento specifico bash (come la simulazione a scopi di reindirizzamento quando non disponibile).
Charles Duffy,

Risposte:


22

>& nè la sintassi della shell per duplicare direttamente un descrittore di file . Il descrittore di file 2 è stderr; è così che funziona. Puoi duplicare anche altri descrittori di file, non solo stderr. Non puoi usare la modalità append qui perché la duplicazione di un descrittore di file non si tronca mai (anche se il tuo stderr è un file) ed >&è un token, ecco perché non puoi mettere uno spazio al suo interno, ma >& 2funziona.

>> nameè una diversa sintassi consentita, dove nameè un nome file (e il token è >>). In questo caso, stai usando il nome del file /dev/stderr, che per gestione specifica del sistema operativo (su Linux, è un link simbolico a /proc/self/fd/2) significa anche errore standard. La modalità di aggiunta e troncamento finisce per fare la stessa cosa quando stderr è un terminale perché non può essere troncato. Se l'errore standard è un file, tuttavia, verrà troncato:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

Se visualizzi un errore con /dev/stderrover ssh, è possibile che l'amministratore del server abbia applicato alcune misure di sicurezza che impediscono il funzionamento di questo link simbolico. (Ad esempio, non è possibile accedere /proco /dev). Anche se mi aspetto che provochi tutti i tipi di strane rotture, l'uso della sintassi del descrittore di file duplicati è un approccio perfettamente ragionevole (e probabilmente leggermente più efficiente). Personalmente lo preferisco.


Avevo un grosso problema nel cercare di replicare quel problema troncato che avevo prima (altrimenti l'avrei aggiunto alla domanda hehe), il motivo per cui ho cambiato tutto da usare >>, grazie per averlo sottolineato! Inoltre, ho perso un passo su SomeUserdopo aver collegato tramite SSH.
Aquarius Power il

questo bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foonon troncerà comunque! (anche con 2>&1 |tee /tmp/foo) ciò che è perfetto per la registrazione e funzionerà perfettamente dopo che avrò cambiato tutto >&2. Quindi immagino che solo un utilizzo diretto dei file /dev/stderrconsenta di troncare, non il descrittore duplicato, cool thx!
Aquarius Power il

@AquariusPower corretto, il descrittore di file duplicato non si tronca mai. È nel primo paragrafo, forse devo evidenziarlo in qualche modo?
derobert,

non è necessario, a volte sono lento ehehe
Aquarius Power

3
Questa risposta può essere migliorata. > & è un gettone non due e c'è nella confusione di OP.
Giosuè il

8

I casi di errore si verificano perché la sintassi bash per l'utilizzo &nei reindirizzamenti specifica un singolo >e richiede che esista direttamente adiacente al &segno:

[N]> & parola


2

Utilizzare '>'per reindirizzare (tronca se esiste) o '>>'(accoda se esiste).

Utilizzare '>&'per duplicare un flusso, ad esempio, se si desidera l'output standard E l'errore standard nello stesso file, si reindirizza al file '> output.log'e si verifica anche l'errore con'2>&'

myjob.sh > output.log 2>&
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.