首先,感謝您提前提供的協助,如果之前已經回答過這個問題,我們深表歉意。我一直沒能找到它。
為了幫助理解我的問題,我編寫了以下名為「list_server_owners」的簡單腳本(它沒有用,但它只是一個範例):
#!/bin/bash
SERVER_LIST=""
SERVER_LIST="$(cat) " # This reads from stdin
for SERVER in $SERVER_LIST
do
echo -n "Please, write the server's owner: "
read OWNER
echo "${SERVER}'s owner is $OWNER"
done
我有以下名為“server_list”的文字檔案:
Server1
Server2
這是透過標準輸入傳遞「server_list」的腳本的輸出:
$ cat server_list | list_server_owner
Please, write the server's owner: Server1's owner is
Please, write the server's owner: Server2's owner is
問題很容易描述:腳本“read OWNER”行沒有按我想要的方式工作。螢幕上未請求伺服器擁有者的名稱。
你知道如何讓命令「讀取」請求畫面上的字串嗎?
答案1
檔案 /dev/tty 是進程控制終端的同義詞,因此只需重定向來自該裝置的輸入:
...
read OWNER </dev/tty
...
您也可以將先前的 echo 提示字元的輸出重定向到 /dev/tty,然後您就可以在管道中使用該腳本:
#!/bin/bash
while read SERVER # this reads from stdin
do
echo -n "Please, write the server's owner: " >/dev/tty
read OWNER </dev/tty
echo "$SERVER:$OWNER" # write to stdout
done
並使用如下:
cat server_list | assign_owner > server_owner
答案2
我已經找到了解決方案。
你必須添加這樣做:
MY_TTY=$(ps -ef | grep -m 1 $$ | awk '{print $6}')
read OWNER </dev/${MY_TTY}
答案3
另一種可能性,對我來說是最簡單的:
exec 0</dev/tty
read OWNER
這樣,您就不需要在腳本中的所有「讀取」命令上指定標準輸入。
我很困惑,因為如果您在腳本中編寫命令“tty”,則沒有輸出,但是,正如最後一條評論所說(謝謝),特殊檔案 /dev/tty 被識別。