reindirizzamento stderr non funzionante in csh


11

Eseguo il seguente comando:

pkg_add emacs-23.4,2.tbz 2> output.log

L'output viene ancora visualizzato nel terminale. Quando premo , ottengo

pkg_add emacs-23.4,2.tbz 2 > output.log

con uno spazio prima del2 .

Inizialmente non l'ho messo. provo

pkg_add emacs-23.4,2.tbz > output.log 2>&1

Ancora una volta, quando premo , sono stati aggiunti spazi .

Perché sta succedendo proprio a me?

Sto eseguendo csh su FreeBSD.

Risposte:


12

Il reindirizzamento 2> non funziona con csh o tcsh.

Utilizzare il chshcomando per modificare la shell in / bin / sh o / usr / local / bin / bash per utilizzare il 2>reindirizzamento dello stile. Nota: non modificare la shell di root in / usr / local / bin / bash

csh e tcsh non possono reindirizzare lo standard out e l'errore separatamente, ma >&reindirizzeranno l'output combinato su un file.


+1 e ✔. Ho cambiato shell usando sh.
gadgetmo,

1
@Craig È in esecuzione pkg_addsu FreeBSD, quindi suppongo che questo sia per l'utente root (/ bin / csh è l'impostazione predefinita per root su FreeBSD). In questo caso è necessario non cambiare la shell di / usr / local / bin / bash. / bin / sh è accettabile. Potresti anche passare a un'altra shell dopo aver effettuato l'accesso come root.
James O'Gorman,

@ JamesO'Gorman Buona cattura ho aggiornato la mia risposta.
Craig

20

Non sono sicuro se stai cercando di nascondere STDERR o reindirizzarlo a STDOUT.

Per reindirizzare STDOUT su un file:

pkg_add emacs-23.4,2.tbz > stdout.log

Per reindirizzare STDOUT e STDERR su un file:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

Per reindirizzare STDOUT su un file e nascondere STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

Per reindirizzare STDOUT alla console e nascondere STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

Per reindirizzare STDOUT alla console e STDERR su un file:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

Per reindirizzare STDOUT su un file e STDERR su un file:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

EDIT: Il motivo per cui questo funziona è che l'azione nel () avviene prima; Ergo, se abbiamo reindirizzato STDOUT, allora non sarà più disponibile al di fuori di (). Questo ci lascia solo con STDERR, e quindi possiamo reindirizzarlo come desiderato.


Ciao @nikc, benvenuto su unix.SE. Il tuo commento è utile e informativo. Suggerirei di modificare la tua risposta e di includerla proprio lì, quindi non è così facile da perdere.
drs

1

So come farlo in Csh, ma usando 2 shell:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

In questo modo è possibile reindirizzare solo stderr a file.txt, senza stdout, ovvero ciò che si desidera.

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.