2015-07-22 58 views
1

在bash中調用函數時是否可以提示用戶輸入?用戶輸入提示功能/管道如果聲明 - Bash

藉此例如:

#!/bin/bash 
test1(){ 

echo "Do you wish to install this program?" 
select yn in "Yes" "No"; do 
    case $yn in 
     Yes) make install; break;; 
     No) exit;; 
    esac 
done 

} 

pip list 2>/dev/null | if grep httplib2; then echo 2>/dev/null; else test1; fi 

無視我檢查httplib2的,因爲我知道,如果你到別的回聲「測試」工作正常的事實。我已經用stackoverflow和tldp的例子試過了,所以我現在有點困惑。

你不能從管道if語句中捕獲用戶輸入嗎?

pip list 2>/dev/null | if grep httplib2; then 
echo 2>/dev/null; 
else 
echo "Type the year that you want to check (4 digits), followed by [ENTER]:" 
read year 
echo $year 
fi 

只是測試,以及與有同樣的效果。

回答

1

如果test1是管道,但你需要從終端輸入,使用方法:

test1 </dev/tty 

例如:

pip list 2>/dev/null | if grep httplib2; then echo 2>/dev/null; else test1 </dev/tty; fi 

test1從標準輸入獲取輸入。如果你想與它交互,它的標準輸入必須來自終端,而不是來自管道的/dev/tty

另一種方法是在管道啓動之前捕獲stdin的句柄。例如:

exec 3<&0; echo http | test1 <&3; exec 3<&- 

或者,

exec 3<&0 
pip list 2>/dev/null | if grep httplib2; then echo 2>/dev/null; else test1 <&3; fi 
exec 3<&- 
+0

如果我用'EXEC 3 <&0;回聲http | test1 <&3'我得到一個破損的管道。 – 123

+0

我認爲「if grep」從stdout獲得了輸入,然後聲明的其餘部分就是它是真是假? – Chirality

+0

@Revolt起初似乎是合理的,但if-then-else結構是一個_compound command_。如果複合命令的stdin被重定向,那麼,除非我們明確地改變它,複合命令中的每個語句都會看到重定向的stdin。 – John1024