Posix
在使用標準輸入時,是否可以保存目前的“stty -g”設置?
我想保存然後恢復腳本中的目前
stty
設置,該腳本也正在消耗stdin
但stty -g
抱怨它:stty:“標準輸入”:設備的 ioctl 不合適
我已經嘗試關閉
stdin
文件描述符並呼叫stty
具有覆蓋 FD 的子 shell。我不知道如何分開stdin
,stty -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
dash
0.5.7 和 GNU Coreutils 8.13 的stty
.