Posix

在使用標準輸入時,是否可以保存目前的“stty -g”設置?

  • September 21, 2019

我想保存然後恢復腳本中的目前stty設置,該腳本也正在消耗stdinstty -g抱怨它:

stty:“標準輸入”:設備的 ioctl 不合適

我已經嘗試關閉stdin文件描述符並呼叫stty具有覆蓋 FD 的子 shell。我不知道如何分開stdinstty -g我很感激幫助或建議。

請注意,我對 POSIX 兼容性特別感興趣。請不要使用 Bash/Zsh 主義。

重現問題的最小腳本:

#!/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以查看錯誤。

@icarus 評論:

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

實際上是指向了正確的方向,但這並不是故事的結局。

在恢復 stty狀態時,您也需要應用相同的重定向。**否則,您仍然會Invalid argument恢復階段獲得或 ioctl 失敗…

正確的做法:

saved_tty_settings="$(stty -g < /dev/tty)"

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

stty "$saved_tty_settings" < /dev/tty

這是我測試的實際腳本;我將整個內容重寫為經典的 Bourne shell 腳本:

#!/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

測試執行:

printf 'This\ntext\nis\nfrom\na\nredirection.\n' | sh sttytest.sh

結果:

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 Almquist Shell dash0.5.7 和 GNU Coreutils 8.13 的stty.

引用自:https://unix.stackexchange.com/questions/542937