首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当同时使用stdin时,可以保存当前的“`stty -g`设置”吗?

当同时使用stdin时,可以保存当前的“`stty -g`设置”吗?
EN

Unix & Linux用户
提问于 2019-09-21 03:33:11
回答 1查看 1.6K关注 0票数 4

我想保存,然后在使用stdin的脚本中恢复当前的D1设置,但是stty -g正在抱怨:

标准输入:设备不合适的ioctl

我已经尝试关闭stdin文件描述符,并使用重写的FDs在子subshell中调用stty。我不知道如何将stdinstty -g分开,我希望得到帮助或建议。

注意,我对POSIX兼容性特别感兴趣。请勿使用Bash/Zsh语言。

重现问题的最小脚本:

代码语言:javascript
运行
复制
#!/usr/bin/env sh

# Save this so we can restore it later:
saved_tty_settings=$(stty -g)
printf 'stty settings: "%s"\n' "$saved_tty_settings"

# ...Script contents here that do something with stdin.

# Restore settings later
# (not working because the variable above is empty):
stty "$saved_tty_settings"

print 'foo\nbar\n' | ./sttytest一起运行以查看错误。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-09-21 09:14:51

@icarus的评论:

也许是saved_tty_settings=$(stty -g < /dev/tty)

其实是指向正确的方向,但这不是故事的结尾。

You在还原 stty states时也需要应用相同的重定向。否则,在恢复阶段仍然会出现Invalid argument或ioctl故障……

正确的行动方针:

代码语言:javascript
运行
复制
saved_tty_settings="$(stty -g < /dev/tty)"

# ...do terminal-changing stuff...

stty "$saved_tty_settings" < /dev/tty

这是我测试的实际脚本;我将整个脚本重写为一个经典的Bourne shell脚本:

代码语言:javascript
运行
复制
#!/bin/sh
# This is sttytest.sh

# This backs up current terminal settings...
STTY_SETTINGS="`stty -g < /dev/tty`"
echo "stty settings: $STTY_SETTINGS"

# This reads from standard input...
while IFS= read LINE
do
    echo "input: $LINE"
done

# This restores terminal settings...
if stty "$STTY_SETTINGS" < /dev/tty
then
    echo "stty settings has been restored sucessfully."
fi

测试运行:

代码语言:javascript
运行
复制
printf 'This\ntext\nis\nfrom\na\nredirection.\n' | sh sttytest.sh

结果:

代码语言:javascript
运行
复制
stty settings: 2d02:5:4bf:8a3b:3:1c:7f:15:4:0:1:ff:11:13:1a:ff:12:f:17:16:ff:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
input: This
input: text
input: is
input: from
input: a
input: redirection.
stty settings has been restored sucessfully.

使用Debian dash 0.5.7和GNU 8.13's stty进行测试。

票数 7
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/542937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档