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

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

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    hello
    en regroupant les commandes dans le meme sous-shell avec des ()
    $ ls | (a=b
    > echo $a )
    b
    $ 
    
    1. 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.
    2. Contributeur
      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
    3. 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 ?
    4. Contributeur
      oui