Forum Programmation.shell Comportement bizarre de redirection en ksh

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
27
nov.
2013

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  (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

  • # version de ksh

    Posté par  (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  . É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  (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  . É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  (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 '??'

        #ls -lb 
        total 8
        -rw-r--r-- 1 root root  5 28 nov.  13:58 \312\004
        -rw-r--r-- 1 root root 29 28 nov.  13:55 t1.sh
        
        # cat t1.sh
        echo plop > >(tee test.log)

        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 :

        # cat t1.sh
        echo plop > >(tee test.log)
        # ksh t1.sh
        t1.sh: 0403-057 Syntax error at line 1 : `>' is not expected.
        #

        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  . É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  (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.

      Process substitution
      If your shell is ksh93, bash or zsh, you can use process substitution.
      This is a way to pass a pipe to a command that expects a file name.
      The shell creates the pipe >and passes a file name like /dev/fd/3 to the command.
      The number is the file descriptor that the pipe is connected to. Some unix variants do not support /dev/fd; on
      these, a named pipe is used instead (see below).

      tee >(command1) >(command2) | command3

      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.