我试图在子shell中理解stty
的操作。这是一个我正在处理的小型Ruby脚本,以包围我的行为。在我们通过tty
退出无限循环后,我只是想保存并恢复^C
状态。
original_tty = `stty -f /dev/tty -g`
begin
loop do end
rescue Interrupt
# Suppress exception
ensure
$stderr.puts `stty -f /dev/tty #{original_tty}`
$stderr.puts "stty exits with: #{$?}, i.e. success == #{$?.success?}"
end
现在,如果你把它放到文件wut.rb
中,当我在bash -c 'echo | ruby wut.rb
的命令行运行它时,它可以工作; 即。 stty
返回0
。但是如果我在子shell 通过命令替换bash -c 'echo $(echo | ruby wut.rb)'
中运行它,它就不会; 即。 stty
返回1
。
直接从命令行运行这些工作正如我所料:
$ foo=$(stty -f /dev/tty -g)
$ echo $foo
gfmt1:cflag=4b00:iflag=6b02:lflag=200005cf:oflag=3:discard=f:dsusp=19:eof=4:eol=ff:eol2=ff:erase=7f:intr=3:kill=15:lnext=16:min=1:quit=1c:reprint=12:start=11:status=14:stop=13:susp=1a:time=0:werase=17:ispeed=38400:ospeed=38400
$ echo | stty -f /dev/tty $foo
$ echo $?
0
$ echo $(echo | stty -f /dev/tty $foo)
$ echo $?
0
我在Mac OS X 10.10.2上使用bash 3.2
和ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
,如果重要的话......
这是为什么?我认为它与命令替换创建的子shell没有/ tty
有关,但我不确定。我非常感谢:
tty
设置的建议。谢谢!