2010-11-01 6 views
2

Pourquoi Bash produit deux sorties différentes pour ces deux commandes:redirection Bash intérieur commande

$ echo $(tput cols 2>/dev/null) 
80 
$ echo $(tput cols) 
141 

PS. Élargissez votre terminal pour avoir plus de 80 colonnes (la plupart des shells sont par défaut à 80).

+0

Je ne peux pas reproduire cela, vous allez devoir fournir plus d'informations. –

+0

Impossible de reproduire: echo $ (tput cols) -> 80 –

+0

Vous auriez besoin d'élargir votre terminal pour avoir plus de colonnes que 80, et que c'est reproductible. –

Répondre

5

Il semble que ce soit parce que stdout et stderr ont été redirigés, donc tput ne sait pas quel terminal vous voulez pour l'info.

$ tput cols >out; cat out  # works because stderr is still the terminal 
118 
$ tput cols 2>err    # works because stdout is still the terminal 
118 
$ tput cols >out 2>err; cat out # lost track of the terminal, going with default 
80 

Notez que dans votre exemple, stdout est redirigé implicitement par $().

+0

Merci. Je ne savais pas qu'il est implicitement redirigé. –

1

Une façon de résoudre ce problème est

$ max_width=`stty -a | sed -n '/columns/s/.*columns \([^;]*\);.*/\1/p' 2>/dev/null` 

stty meilleure façon de faire ce que vous voulez!

+0

et je cherchais en fait la solution de contournement, merci! –

+0

peut être ceci est nouveau: 'stty taille 2>/dev/null | cut -d" "-f2' –