Shell-Script
如何從管道讀取使用者輸入?
假設我有一個名為
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]?
了,腳本被打斷了。有什麼問題?
正如其他人所說,這是因為
stdin
ofsh
已被重定向以從管道讀取,它沒有像通常那樣連接到終端。您可以做的一件事是使用/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
在提示符下自動輸入,它仍然會從終端讀取。期望密碼來執行此操作的程序很常見。