URL: https://linuxfr.org/forums/general-general/posts/interchanger-les-flux Title: Interchanger les flux. Authors: doublehp Date: 2005年05月21日T05:46:43+02:00 Tags: Score: 0 Attention c'est du BASH de haut niveau. Newbies passez votre chemin. je viens de passer 24h sur un script d'une seule ligne: récupérer dans une variable la valeur de retour d un *dialog directement dans une variable. Avec Xdialog, j'avais originalement: r=`${DIAG} --title "Eapp editor" --fselect "" 50 100 2»ET1` et roulez jeunesse. Puis un mec m as dit: tu sais, Xdialog et dialog sont 100% compatibles au niveau arguments ... (mouai, vite dit ... à part --menubox , et évidement, je m'en sers .. mais passons). Et la tout de suite, si vous lancez la même commande avec DIAG=dialog, tout de suite, ça marche beaucoup moins bien: car vous foutez dans $r toute la sortie d affichage !!! donc y a plus rien a l'écran. Il faut savoir que dialog envoi l'affichage sur stdout, et le champ de retour sur stderr (la valeur de retour elle meme signale les erreurs internes a dialog). C est donc stderr qui contient ce que l utilisateur a saisi dans la boite ... tous les exemples de Google font bètement: dialog 2»/tmp/file Oui mais, avec Xdialog, ça marche tres bien sans ficher temporaire. Donc hors de question que mon script 'de qualité' s'abaisse à ce niveau quand Xdialog permet de ne pas en creer !!! La j ai passé une journée entière à essayer des trucs du genre cmd 2 » $r cmd 2 » ET $r ... tout y est passé ... Mais en fait, quand on fait un 2»file, tout ce que fait bash, c'est placer dans le pointeur stdout l'adresse du fichier !!! Puis au bout de 24h, je me suis rappellé mon cours de C: pour échanger le contenu de deux variables, il faut en utiliser une 3e. DONC: si notre problème pouvais consister à juste échanger les adresses 1 et 2, ben, il suffit d utiliser 3 !!! r=`${DIAG} 3»ET2 2»ET1 1»ET3` et hop ça marche !!! n'oubliez pas de lire a l envers: - les arguments sont traités de gauche a droite - les assignations sont faites de droite a gauche !!! 3»ET2 signifie: je place l'adresse de 2 dans le pointeur de 3 et voila: cela échange proprement les adresse 1 et 2 sur respectivement stderr et stdout. Ainsi, r receois bien le champs utilisateur écrit sur 2, tandis que l affichage se fait sur stderr, donc bien à l'écran. À bon entendeur, salut.

AltStyle によって変換されたページ (->オリジナル) /