如何透過管道發送標準輸入

如何透過管道發送標準輸入

我需要在程式啟動後立即發送標準輸入或鍵碼。

例如

$ program | F3

答案1

你需要定義開始那裡。

F3當您按下終端設備輸入緩衝區時,您可以插入終端發送的字元序列在 Linux 等某些系統上使用 TIOCSTI ioctl() 運行程式:

{
   perl -le 'require "sys/ioctl.ph";
   ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
   program
}

或者您可以使用類似的方法expect在偽造的終端層中運行您的程序,等待它輸出一些提示(或任何表明它是開始了直到您期望的程度),然後發送該輸出:

expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'

(這裡期待一個提示,替換為準備好讀取輸入時輸出的>一些字串)。program

您也可以將其標準輸入替換為管道,但如果該應用程式需要F3按鍵之類的操作,那麼它很可能是一個互動式應用程序,因此當它的標準輸入不是終端時,它可能會不喜歡它。無論如何,你總是可以嘗試:

tput kf3 | program

然而,在program讀取 的輸出後tput,它將看到檔案結尾(沒有更多內容可讀取),這可能會導致它退出。和:

{ tput kf3; cat; } | program

我們發送 的輸出kf3,然後用於cat將您在終端上輸入的所有內容轉發到program。話又說回來,它不太可能工作,因為很可能program會將終端置於一種模式,在這種模式下,只要您鍵入並禁用它就echo無法再執行的操作,因為它的輸入不是終端。

您可以自己做同樣的設定:

saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"

相關內容