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.

gadgetmo
la source

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.

Craig
la source
+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.

nikc
la source
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.

Alexander Samoylov
la source