如何从子shell中保存和恢复TTY设置? (或者:理解子壳内的pty / tty)

时间:2015-03-06 21:39:24

标签: bash shell unix tty pty

我试图在子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.2ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14],如果重要的话......


这是为什么?我认为它与命令替换创建的子shell没有/ tty有关,但我不确定。我非常感谢:

谢谢!

0 个答案:

没有答案