Shell-Script

如何從管道讀取使用者輸入?

  • June 6, 2019

假設我有一個名為confirmation.sh以下內容的文件:

#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
   n|N) echo "smth"
       ;;
   y|Y) echo "smth"
       ;;
esac

我想通過以下方式執行這個腳本:

cat confirmation.sh | sh

我看到Are you sure [Y/n]?了,腳本被打斷了。有什麼問題?

正如其他人所說,這是因為stdinofsh已被重定向以從管道讀取,它沒有像通常那樣連接到終端。您可以做的一件事是使用/dev/tty強制腳本從終端讀取。例如:

#!/bin/sh

read -p "Are you sure [Y/n]?" line </dev/tty
case "$line" in
 y|Y) echo "confirmed"
   ;;
 *) echo "not confirmed"
   ;;
esac

通常,只有在您特別想阻止人們編寫輸入腳本時,您才會這樣做,例如:

echo Y | sh confirmation.sh

即使使用者可能希望它Y在提示符下自動輸入,它仍然會從終端讀取。期望密碼來執行此操作的程序很常見。

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