为什么“stty -echo”不关闭 macOS 上的回显位
Why does ‘stty -echo’ not turn off the echo bit on macOS
我正在阅读 Bruce Molay 的《理解 Unix/Linux 编程》。在第 5 章中,本书介绍了一个新命令 stty
,可以帮助您配置终端设置。
书中提到的一个例子是用stty -echo
关闭回显,然后我在我的Mac上试了一下,发现根本不起作用。
// here is some infomation about my mac
Mac mini (M1, 2020)
OS version: 11.4
// by the way, I also tested it on my old intel mac, and I got the same result
Macbook Pro(Early 2015)
OS version: 10.15.6
// here are the commands I used in the terminal on Mac
➜ ~ stty -a # check the old 'echo bit' status
speed 38400 baud; 45 rows; 139 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 = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
➜ ~ stty -echo # turn off echo bit
➜ ~ stty -a # see the results
speed 38400 baud; 45 rows; 139 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 = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
然后我在 ubuntu docker 容器中对其进行了测试,并且 stty -echo
完美运行.
那么为什么它在 macOS 上不起作用?
交互式 shell 保留对 stty 设置的一些控制。
在 Ubuntu 中,您使用的是 bash,而在 MacOS 中,您使用的是 zsh。
作为测试,运行 /bin/bash 在 MacOS 中进行测试。
更新
交互 shells 不影响 stty 的行为,它们可以在显示提示之前改变 tty 的等同于 stty echo
的属性。
您可以在 zsh 中通过 运行ning 验证这一点:
stty -a; stty -echo; stty -a
要zsh不要做stty echo
,你可以做:
unsetopt ZLE
但这会禁用 zsh 的编辑功能,这不是您想要的。
我正在阅读 Bruce Molay 的《理解 Unix/Linux 编程》。在第 5 章中,本书介绍了一个新命令 stty
,可以帮助您配置终端设置。
书中提到的一个例子是用stty -echo
关闭回显,然后我在我的Mac上试了一下,发现根本不起作用。
// here is some infomation about my mac
Mac mini (M1, 2020)
OS version: 11.4
// by the way, I also tested it on my old intel mac, and I got the same result
Macbook Pro(Early 2015)
OS version: 10.15.6
// here are the commands I used in the terminal on Mac
➜ ~ stty -a # check the old 'echo bit' status
speed 38400 baud; 45 rows; 139 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 = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
➜ ~ stty -echo # turn off echo bit
➜ ~ stty -a # see the results
speed 38400 baud; 45 rows; 139 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 = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
然后我在 ubuntu docker 容器中对其进行了测试,并且 stty -echo
完美运行.
那么为什么它在 macOS 上不起作用?
交互式 shell 保留对 stty 设置的一些控制。
在 Ubuntu 中,您使用的是 bash,而在 MacOS 中,您使用的是 zsh。
作为测试,运行 /bin/bash 在 MacOS 中进行测试。
更新
交互 shells 不影响 stty 的行为,它们可以在显示提示之前改变 tty 的等同于 stty echo
的属性。
您可以在 zsh 中通过 运行ning 验证这一点:
stty -a; stty -echo; stty -a
要zsh不要做stty echo
,你可以做:
unsetopt ZLE
但这会禁用 zsh 的编辑功能,这不是您想要的。