运行 Ruby 脚本后,几乎 100% 的情况下,bash 命令行都会出现处于非活动状态,而事实上它默默地接受我的击键而不向我显示。
在多个版本的 Ruby 中,通过多次操作系统更新,都发生过这种情况;目前,我在 OS X 10.9.2 上运行 v1.9.2p29。reset
解决了该问题;clear
而 等,则没有。
下面的“现在你不知道”等等是看不见的命令的输出echo
。
$ echo Now you see my typing...
Now you see my typing...
$ bundle exec jekyll build
...
done.
$ This is the output of an unseen echo command
$ About to run "reset"
$ echo And we''re back.
And we're back.
stty -a
一切正常时的输出:
speed 9600 baud; 57 rows; 187 columns;
lflags: icanon isig -iexten echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
-ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef>;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
stty -a
当情况不是这样时输出:
speed 9600 baud; 57 rows; 187 columns;
lflags: -icanon isig -iexten -echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
-ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = <undef>; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U;
lnext = <undef>; min = 1; quit = ^\; reprint = <undef>;
start = ^Q; status = <undef>; stop = ^S; susp = ^Z; time = 0;
werase = <undef>;
我特别注意到,在 中lflags
,echo
已经变成了-echo
。
不确定是什么原因导致的,或者我应该检查哪些其他设置/诊断。
答案1
当你在提示符中输入以下内容时:
$ And now you don't.
>
这触发了命令行延续。您显然没有在 OSX 上设置辅助提示符(我猜是提示符的问题),但您的问题是因为您使用了那个特定的字符串“$ And now you don't.`”。
当你输入以下内容时:
$ echo And we''re back.
And were back.
您正在关闭延续。请尝试不同的字符串,看看是否会出现同样的问题。
笔记:底线问题在于您的使用'....'
。
答案2
echo
终端驱动程序设置中的设置指定终端驱动程序是否应该回声返回您输入的字符。应用程序vi
或现代 shell在他们的提示下不要使用那个,他们也不使用终端典范模式,它们确实处理每一个按键,并且回声通过写入终端设备,您可以自己输入内容。
但是,readline 以及使用它的任何应用程序,例如bash
或gdb
也会禁用他们的 回响当检测到终端echo
已被禁用时,其他 shell 会喜欢zsh
或tcsh
不喜欢。
请注意,在(或任何具有自己的行编辑器的现代 shell) shell 提示符echo
下始终禁用,因为 readline 会自行回显。/在每个提示之前保存终端设置,并将其设置为实现其行编辑器所需的设置 (包括禁用),然后在运行命令之前将其重置为保存的值。bash
bash
readline
echo
因此的输出stty -a
是保存的配置。并且bash
/readline(但不是其他 shell)在echo
被禁用时会禁用其自身的回显在保存的配置中。
通过发出以下命令,您可以获得与所见相同的行为:
stty -echo
应用程序通常在发出密码提示时禁用终端回显,或者像上述情况一样vi
,bash
以实现它们自己的文本编辑(然后它们不使用终端规范模式),并且在退出时恢复设置。
您的情况的另一个不同之处是icanon
已被禁用,这表明我们更有可能出现第二种情况。
您的 ruby 脚本可能启动了一个无法正确重置终端设置的可视化应用程序。如果该应用程序被不可捕获的信号(如 SIGKILL)终止,或者它仍在运行或暂停,则可能会发生这种情况。
要恢复终端设置,您可以执行stty sane
或reset
。您可能需要检查没有进程仍在运行以及该脚本运行的应用程序以及它为什么行为不当。