Bonjour tout le monde,
Je dois debugger un script qui n'a pas le même comportement sur 2 machines différentes et je ne sais plus où chercher les différences.
Voilà le bout de code très simplifier qui ne fonctionne pas :
$ echo plop > >(tee /tmp/output)
ksh: : cannot create [Permission denied]
$
Cette même commande fonctionne très bien sur une autre machine.
PS: ce truc bizarre n'est pas de moi, je ne veut pas le re-écrire mais juste comprendre pourquoi ça marche d'un coté et pas de l'autre.
PPS: les versions de coreutils (tee) et de ksh sont strictement identique. D'ailleurs, le problème est le même avec un > à la place du tee.
Merci d'avance à tous
# t'as surement déja regardé mais bon:
Posté par yohann (site web personnel) . Évalué à 3.
le fichier /tmp/output existe et appartient à un autre user sur la machine ou cela ne fonctionne pas, d'où le permission denied
[^] # Re: t'as surement déja regardé mais bon:
Posté par Cereal Killer . Évalué à 1.
Effectivement, déjà regardé et c'est pas ça.
# version de ksh
Posté par M.Poil (site web personnel) . Évalué à 2.
De mémoire y a du ksh88 et du ksh93, (je n'ai pas googlé pour vérifier ma mémoire), peut être une différence à ce niveau ?
Is it a Bird? Is it a Plane?? No, it's Super Poil !!!
[^] # Re: version de ksh
Posté par Cereal Killer . Évalué à 0.
Non, malheureusement, c'est la même version de ksh, sur le même OS avec le même paquet installé de la même façon, avec le même ~/.kshrc :/
# strace un jour, strace toujours
Posté par ze_lionix (site web personnel) . Évalué à 2. Dernière modification le 28 novembre 2013 à 09:56.
Hello,
J'imagine que tu as essayé à la main de faire le 'tee /tmp/output' pour voir…
Vue que tu as marqué "Voilà le bout de code très simplifier qui ne fonctionne pas :" on peux déduire que tu n'as pas mis tout le programmes, et donc que le permission denied vient peut-être d'un autre endroit…
L'erreur est forcement de type droit sur un fichier ou un binaire.
Personnellement je lancerais un strace et regarderais sur quoi l'erreur EACCES est levée.
Fuse : j'en Use et Abuse !
[^] # Re: strace un jour, strace toujours
Posté par Cereal Killer . Évalué à 1.
Le permission denied venait bien de ce bout de code et spécifiquement de cette empilement de redirection.
J'ai aussi pensé au strace, et voilà c'que ça disais :
open("\312\4", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)
J'ai pas le reste de la trace vu que le bug ne se reproduit plus et que mon term sur cette machine est fermé. Je l'ai retrouvé dans l'historique de mes recherches google.
Perso, je sais pas c'que \312\4 signifie. Si une âme charitable meilleur que moi en c système linux pouvait expliquer …
[^] # Re: strace un jour, strace toujours
Posté par Christophe B. (site web personnel) . Évalué à 1. Dernière modification le 28 novembre 2013 à 14:28.
Quand je le lance sur un serveur Linux avec ksh
cela me crée un fichier '??'
La première indirection considère la 2eme comme un nom de fichier alors qu'il s'agit d'autres choses
ce qui crée le fichier '??'
J'ai testé sur un vieil AIX 5.3 et voici le résulat :
après recherche 0403-057 signifie : c'est pas au vieux singe qu'on apprend à faire des grimaces.
Pour moi c'est une erreur de syntaxe car le plus c'est quand même d'écrire
echo plop | tee tmp.ouput
# Re-écriture du script
Posté par Cereal Killer . Évalué à 1.
Pour info, finalement, j'ai juste ré-écrit le script de manière plus lisible.
Et, après avoir re-testé ce matin sur les 2 machines, j'ai à le même comportement :/ pt'être un truc lié au 27 Novembre ? :)
Quoiqu'il en soit, ce bout de truc ne marchait juste pas en ksh alors qu'il marche en bash. Il n'écrit rien, ni sur stdout, ni dans le fichier. Alors que le client utilise ce script depuis des années sans jamais s'en être rendu compte. C'est d'ailleurs pour ça que je l'ai ré-écris.
Ceci dis, par curiosité, si quelqu'un pouvait m’expliquer le pourquoi ça fonctionne en bash et pas en ksh … et éventuellement, qu'est-ce que ça fait exactement.
Pour moi, ça redirige la sortie standard dans un sous shell qui redirige sa sortie standard sur tee.
Le type utilisait ça pour mettre stdout et stderr dans un tee => echo plop 1> >(tee -a $LOG_OUT) 2> >(tee -a $LOG_ERR >&2).
[^] # Re: Re-écriture du script
Posté par Christophe B. (site web personnel) . Évalué à 2.
En fait cela pourrait être un truc comme ca : How can i send stdout to multiple commands
En gros il voulait utiliser la syntaxe de tee qui permet d'envoyer ce qu'il reçoit a plusieurs destinations
et dans certain il est possible de substituer la destination avec une commande.
Le truc permet d'éviter d'utiliser un fichier fifo.
Doit y avoir moyen de faire plus simple et plus facile a maintenir :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.