LINES和COLUMNS脚本中丢失的环境variables

考虑以下:

me@mine:~$ cat a.sh #!/bin/bash echo "Lines: " $LINES echo "Columns: " $COLUMNS me@mine:~$ ./a.sh Lines: Columns: me@mine:~$ echo "Lines: " $LINES Lines: 52 me@mine:~$ echo "Columns: " $COLUMNS Columns: 157 me@mine:~$ 

variables$LINES$COLUMNS是shellvariables, 而不是环境variables,因此不会导出到subprocess(但是当我调整xterm窗口的大小时,即使通过ssh从远程位置login时,它们也会自动更新)。 有没有办法让脚本知道当前的terminal大小?

编辑:我需要这个解决方法做这个问题 :vi(以及vim,less,和类似的命令)弄乱了屏幕每次我使用它。 改变terminal是不是一个选项,因此我正在寻找解决方法(滚动$LINES行肯定不是一个完美的解决scheme,但至less比丢失前一个屏幕更好)

你可以从tput获取行和列:

 #!/bin/bash lines=$(tput lines) columns=$(tput cols) echo "Lines: " $lines echo "Columns: " $columns 
 kill -s WINCH $$ 

确实设置了variables。

 eval $( resize ) 

做这个工作…(在基于xterm的terminal上)

你有没有试过让你的朋友说:

 #!/bin/bash -i 

运行help export可能有帮助?

 me@mine:~$ cat a.sh #!/bin/bash echo "Lines: " $LINES echo "Columns: " $COLUMNS me@mine:~$ ./a.sh Lines: Columns: me@mine:~$ echo "Lines: " $LINES Lines: 52 me@mine:~$ echo "Columns: " $COLUMNS Columns: 157 me@mine:~$ export LINES COLUMNS me@mine:~$ ./a.sh Lines: 52 Columns: 157 me@mine:~$ 

bash中的$LINES$COLUMNS只是TTY ioctl的一个shell-y包装,它提供了TTY的大小,以及每当大小发生变化时terminal发送的信号。

你可以使用其他语言编写程序,直接调用这些ioctl来获得TTY维度,然后使用该程序。

编辑:那么,事实certificate,程序已经存在,被称为tput 。 投票基于Puppe tput的答案 。

 #!/bin/bash -i 

-i现在可以使用bash 4.2.10(1) –Ubuntu 11.10上发布

 $ cat show_dimensions.sh #!/bin/bash -i printf "COLUMNS = %d\n" $COLUMNS printf "LINES = %d\n" $LINES $ ./show_dimensions.sh COLUMNS = 150 LINES = 101 $ bash --version GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 

数字确实随窗口大小而改变; 一个陷阱显示脚本正在获取SIGWINCH。