2012-02-24 1 views
0

Je suis en train d'exécuter le shell tcsh/csh sur ma machine. Dernièrement, j'ai réalisé que ma redirection de fichier stderr ne fonctionnait pas.Méthodes de redirection stderr

S'il vous plaît trouver les journaux du terminal comme ci-dessous:

>echo b c >>& log 
>cat log 
b c 
>echo $a b c >>& log 
a: Undefined variable. 
>cat log 
b c 

Je n'ai jamais rencontrés ces questions, donc pas sûr de savoir comment déboguer ou dépanner. S'il vous plaît avis!

Une méthode de redirection alternative utilise té. Pendant que j'utilise> & ou >> &, je bloque complètement toute sortie à afficher sur le terminal. Y a-t-il un moyen de faire les deux, c'est-à-dire: pour chaque instruction

a) de diriger stdout + stderr vers un fichier.

b) stdout d'affichage + stderr sur la borne

Je dois confirmer si je peux utiliser quelque chose comme ça (ci-dessous) pour répondre à mes besoins Dans mon cas

>csh ./script_name | tee -a log 

il dirige seulement StdOut de se connecter fichier et bloque stderr.

Répondre

1

Je suis certain que l'évaluation des $a est fait par le shell en cours, avant la redirection est mis en place pour la echo sous-shell?

Il semble être étayée par le fait que le echo est écrit pas réellement le fichier du tout, que vous pouvez voir si vous avez supprimé le fichier log avant la deuxième tentative:

[pax ~]$ echo b c >>& log 

[pax ~]$ cat log 
b c 

[pax ~]$ rm log 

[pax ~]$ echo $a b c >> & log 
a: Undefined variable. 

[pax ~]$ cat log 
cat: log: No such file or directory 

et aussi par le fait que, si vous exécutez le echo dans un sous-shell explicite avec la redirection fait pour le sous-shell plutôt que le echo, vous obtenez le résultat souhaité:

[pax ~]$ (echo $a b c) >> & log 

[pax ~]$ cat log 
b c 
a: Undefined variable. 

En fait, vous pouvez voir ce sans même utiliser une commande valide:

[pax ~]$ rm log 

[pax ~]$ $xyzzy 
xyzzy: Undefined variable. 

[pax ~]$ $xyzzy >>&log 
xyzzy: Undefined variable. 

[pax ~]$ cat log 
cat: log: No such file or directory 

La raison est que le shell actuel se plaint d'essayer d'évaluer $xyzzy. C'est logique. Avec la commande:

someCmd $HOME 

l'exécutable someCmd sera jamais voir le $HOME littéral, il est en fait remplacée par la valeur. Et ce remplacement est effectué par le shell avant même que someCmd ne soit configuré (y compris ses flux d'entrée ou de sortie standard modifiés).

+0

Je ne suis pas sûr de savoir comment vérifier cela. D'après ce que je comprends, même si l'interprétation est faite pour $ a, il ne devrait pas arrêter l'exécution, mais devrait diriger stdout + stderr vers le fichier journal. – Ani

+0

@Ani, vous pouvez le vérifier, comme je l'ai fait, en forçant la redirection à se produire d'abord _then_ en faisant l'expansion, a la '(echo $ a) >> & log'. J'ai mis à jour la réponse avec plus de détails. – paxdiablo

+0

Merci pour la réponse, cela me fait mieux comprendre comment les instructions sont en cours d'exécution. – Ani

0

Vous ne pouvez pas effectuer de manipulation de descripteur de fichier et le mantra Csh Programming is considered harmful a fait l'objet d'un écho au cours des 20 dernières années.

Il y a beaucoup de shells alternatifs disponibles et même/bin/sh est une meilleure option pour programmer des scripts que tcsh/csh. J'espère qu'après tout ce temps personne ne vous oblige à utiliser csh.

+0

Vous pouvez voter en bas mais csh ne peut pas 2> & 1 – tawman

+0

Vous avez raison à ce sujet, mais je ne suis pas sûr exactement ce que cela a à voir avec la question à portée de main. Je trouve que les compilateurs de certaines grandes entreprises sans nom sont inadéquats selon les normes ISO, mais quand on me pose une question à leur sujet, je ne sais pas comment le demandeur devrait passer à gcc :-) Vous ne déboguez pas un mineur problème comme ça en changeant et réapprendre tous vos outils. – paxdiablo

+0

@paxdiablo La personne demande pourquoi je ne peux pas rediriger stderr vers le fichier et ma réponse est que vous ne pouvez pas. CSH ne le supporte pas. C'est loin de l'argument faux que vous suggérez. Totalement sans rapport. – tawman

Questions connexes