Récupérer la valeur d'une variable d'un sous-shell

gnugo -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Rebonjour,

Suite à ma question de tout à l'heure (faire un traitement sur STDERR seul dans un pipe), je voudrais savoir s'il est possible de récupérer la valeur d'une variable d'un sous-shell ?

exemple :
ls | a=texte
echo $a
=> Rien (au lieu de "texte")

Il me faudrait récupérer dans mon shell courant la variable $a, par n'importe quel moyen mais sans passer par un fichier temporaire, et sans utiliser STDIN ou STDERR qui sont déjà utilisés .

Ou encore en reprenant l'excellent exemple de dubcek:
$ (echo aaa ; echo bbb>&2 ; echo ccc) 2> >(sed 's/^/stderr: /' >&2) | sed 's/^/stdout: /'
stdout: aaa
stdout: ccc
stderr: bbb

=> Ça devient compliqué: en plus de modifier STDERR, j'ai besoin d'en récupérer une partie modifiée dans mon shell courant.
Pour simplifier, disons que je cherche à récupérer le résultat de "sed 's/^/stderr: /'" dans mon shell courant (dans une variable par exemple) pour le réutiliser ensuite.

Y a t-il un moyen de faire cela?
Ouvrir un 3eme flux et l'enregistrer dans une variable? Mais ça semple compliqué dans un sous shell qui est lui même dans un pipe

1 réponse

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    en regroupant les commandes dans le meme sous-shell avec des ()
    $ ls | (a=b
    > echo $a )
    b
    $ 
    
    0
    1. gnugo
       
      Le but c'est justement de ne pas les regrouper dans le même sous-shell.
      C'est de récupérer le résultat d'un sous shell dans le shell courant.

      Un peu comme quand on fait a=$(echo b)

      Sauf que à ce sous-shell, je dois en plus lui passer quelquechose sur son entrée standard, et faire un traitement à part pour son STDOUT. Ce que je souhaite récupérer c'est son STDERR pour le traiter dans mon shell courant et le garder dans une variable utilisée par la suite.
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      ce n'est pas possible de passer une variable d'un sous-shell au shell appellant.
      on peut mettre plusieurs commandes dans $()
      a=$(echo b ; echo c ; ls)
      montre un exemple de ce que tu veux faire
      0
    3. gnugo
       
      Et si je m'arrange pour passer par le pipe l'adresse d'un fd que j'aurais ouvert en écoute dans le bash principal ?
      Ce serait envisageable de faire quelque chose comme ça ?
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      oui
      0