当我查看终端模拟器的长度和宽度时,stty size它长 271 个字符,高 71 行。当我通过 SSH 登录到另一台服务器并执行时stty size,它也是 271 个字符长和 71 行高。我什至可以登录一些 Cisco IOS 设备,终端仍然是 271 个字符长和 71 行高:
C1841#show terminal | i Len|Wid
Length: 71 lines, Width: 271 columns
C1841#
Run Code Online (Sandbox Code Playgroud)
现在,如果我在本地机器上调整终端模拟器(Gnome 终端)窗口的大小stty size,远程服务器和 IOS 中的“显示终端”都会显示不同的行长和行数。终端长度和宽度如何通过 SSH 和 telnet 转发?
让我们运行cat然后输入athen ^D- 你会看到cat没有退出。
与cat+ a+ Enter+比较^D- 现在 cat 确实退出了。
那么,为什么在第一种情况下^D需要按两次退出cat,而^D在第二种情况下只需要按一次?
我想将bash命令提示符输入保留在屏幕顶部,以便将旧命令的输出向下推而不是向上推。
我怎样才能做到这一点?
我正在玩一个 perl 脚本,它接受用户输入以下内容:
system( qw( stty -echo ) );
$? == 0 or die "Error unable to disable character printing.\n";
print "$prompt: ";
my $input = <STDIN>;
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用 echo 在响应中进行管道传输,但是它似乎与 stty -echo 命令冲突并产生以下错误:
stty: standard input: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)
在不更改 perl 脚本的情况下,在 bash 中可以做什么来传递输入?导致问题的原因是什么?
我想要一些 83(cols)x40(rows) 大小在我的TTY 上,所以:
xubuntu@xubuntu:~$ stty size
30 90
xubuntu@xubuntu:~$ stty cols 83 rows 40
stty: standard input: Invalid argument
xubuntu@xubuntu:~$ stty size
30 83
Run Code Online (Sandbox Code Playgroud)
从我的示例中可以看出,我的计算机不支持 cols=40。
所以我必须尝试:
xubuntu@xubuntu:~$ stty rows 39
stty: standard input: Invalid argument
xubuntu@xubuntu:~$ stty rows 38
stty: standard input: Invalid argument
xubuntu@xubuntu:~$ stty rows 37
stty: standard input: Invalid argument
xubuntu@xubuntu:~$ stty rows 36
xubuntu@xubuntu:~$
Run Code Online (Sandbox Code Playgroud)
...直到我成功。
有没有办法直接将 stty 设置为最大值?也许是这样的:
xubuntu@xubuntu:~$ stty rows max
Run Code Online (Sandbox Code Playgroud) 我最近在运行tail -f的服务器的日志文件上运行,试图诊断错误,当我不小心撞到键盘并输入了一些字符时。它们与日志的输出混合在一起,无法分辨哪个是哪个。我已经无数次发生过类似的恼人的事情,我相信这里的许多其他人也发生过这种情况。
所以我的问题是:为什么 shell(或终端,或任何正在执行的操作)模糊地将键盘输入与命令输出混合在一起?
我不是在寻求针对眼前问题的实际解决方案。我也许可以想出某种方法让 shellstty -echo在命令运行和stty echo完成时运行。但我想知道设计这样的终端背后的基本原理。有什么实际目的吗?或者它只是出于兼容性原因而做的事情,还是根本没有考虑过的事情?
我有一个由显示驱动程序控制的小型 LED 矩阵,该驱动程序接受串行命令来更新显示。我通过带有节点串行包的节点成功控制了它,但是我希望能够使用 echo 更新它,以便我可以在启动过程中使用 shell 脚本更早地控制它。
为了开始测试这个新方法,我设置了它:
chmod o+rw /dev/ttyUSB0
stty /dev/ttyUSB0 115200
Run Code Online (Sandbox Code Playgroud)
我可以使用屏幕向它发送命令:
screen -F /dev/ttyUSB0 115200
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用时:
echo -e 'title \r' > /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
它不起作用,当我在另一个窗口中监视响应时
cat -v < /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
我看到它正在接收消息,但它似乎是零散的,并且还不断响应错误,就好像我正在发送大量错误和/或空白命令一样。
如何使用 echo 模拟从屏幕发送的命令?
当 bash shell 忙(初始化、运行命令)时,可以在下一个提示出现之前键入。
如果 shell 启动了一个程序,该程序将捕获密钥,但如果没有程序运行或如果程序没有捕获输入,则在出现提示后会在 shell 中插入什么类型。
例如:键入sleep 5,按 Enter,然后键入ls并按 Enter。 ls将在 sleep 完成后运行。在现实生活中,ls会被cp,rsync或许多其他程序所取代。这是一个典型的Typeahead功能,当您提前知道要键入什么时,它可以节省大量时间。
它也非常好,因为它允许复制粘贴多个命令并让它们按顺序运行。
实际用例包括 shell 需要时间来初始化。可能是由于任何原因计算机速度变慢,或者外壳在网络链接上速度较慢,等等。
在 bash 提示符下,可以键入Ctrl-R以搜索历史记录。
当重用一些旧的命令行,甚至命令行序列时,这是一个非常宝贵的时间节省。按Ctrl-R,键入几个典型的搜索命令字符,按Ctrl-O需要多次按从那里重播记录的命令。
但是,有一个限制。我经常使用上面的序列并发现如果我Ctrl-R ls在 shell 提示实际出现之前输入例如,该Ctrl-R部分会被忽略但ls会显示该部分。
最终效果是在键入之前必须等待 shell 提示出现Ctrl-R,从而节省了部分时间。
有没有办法在提前Ctrl-R输入的情况下兑现?
我可以用 bash 隐藏终端中写的内容
stty -echo
Run Code Online (Sandbox Code Playgroud)
然而,这对 zsh 不起作用:运行此命令不会改变输出
stty -a
Run Code Online (Sandbox Code Playgroud)
stty -echofor zsh的等效命令是什么?
在 Ubuntu/gnome-terminal 中,如果我运行:
$ stty -icrnl
Run Code Online (Sandbox Code Playgroud)
然后启动 GHC 交互环境(一个 Haskell 控制台):
$ ghci
Run Code Online (Sandbox Code Playgroud)
然后按Return不提交行;然而,Enter确实如此。
但是,与:
$ stty icrnl
Run Code Online (Sandbox Code Playgroud)
双方Return并Enter提交该行。
我不太理解这种行为;Return在这两种情况下肯定会提交换行符吗?