la redirection stderr ne fonctionne pas dans csh


11

J'exécute la commande suivante:

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

La sortie s'affiche toujours dans le terminal. Quand j'appuie , je reçois

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

avec un espace avant le2 .

Je n'ai pas mis cela à l'origine. J'essaie

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

Encore une fois, lorsque j'appuie sur , des espaces ont été ajoutés .

Pourquoi cela m'arrive-t-il?

J'utilise csh sur FreeBSD.

Réponses:


12

La redirection 2> ne fonctionne pas avec csh ou tcsh.

Utilisez la chshcommande pour changer votre shell en / bin / sh ou / usr / local / bin / bash afin d'utiliser la 2>redirection de style. Remarque: ne changez pas le shell de root en / usr / local / bin / bash

csh et tcsh ne peuvent pas rediriger la sortie standard et l'erreur séparément, mais >&redirigent la sortie combinée vers un fichier.


+1 et ✔. J'ai changé d'obus en utilisant sh.
gadgetmo

1
@Craig Il fonctionne pkg_addsur FreeBSD, donc je suppose que c'est pour l'utilisateur root (/ bin / csh est la valeur par défaut pour root sur FreeBSD). Dans ce cas, vous ne devez pas changer le shell en / usr / local / bin / bash. / bin / sh est acceptable. Vous pouvez également simplement basculer vers un autre shell après vous être connecté en tant que root.
James O'Gorman

@ JamesO'Gorman Bonne capture J'ai mis à jour ma réponse.
Craig

20

Je ne sais pas si vous essayez de masquer STDERR ou de le rediriger vers STDOUT.

Pour rediriger STDOUT vers un fichier:

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

Pour rediriger STDOUT et STDERR vers un fichier:

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

Pour rediriger STDOUT vers un fichier et masquer STDERR:

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

Pour rediriger STDOUT vers la console et masquer STDERR:

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

Pour rediriger STDOUT vers la console et STDERR vers un fichier:

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

Pour rediriger STDOUT vers un fichier et STDERR vers un fichier:

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

EDIT: La raison pour laquelle cela fonctionne est que l'action dans le () se produit en premier; Ergo, si nous avons redirigé STDOUT, alors il ne sera plus disponible en dehors des (). Cela nous laisse juste STDERR, puis nous pouvons rediriger cela comme vous le souhaitez.


Salut @nikc, bienvenue sur unix.SE. Votre commentaire est utile et instructif. Je suggérerais de modifier votre réponse et de l'inclure ici pour qu'elle ne soit pas si facilement manquée.
drs

1

Je sais comment le faire en Csh, mais en utilisant 2 shells:

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

Une telle façon permet de rediriger uniquement stderr vers file.txt, sans stdout - à savoir ce que vous vouliez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.