如何在 Shell 腳本上使用命令“read”從 stdin 讀取其參數

如何在 Shell 腳本上使用命令“read”從 stdin 讀取其參數

首先,感謝您提前提供的協助,如果之前已經回答過這個問題,我們深表歉意。我一直沒能找到它。

為了幫助理解我的問題,我編寫了以下名為「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 被識別。

相關內容