web-dev-qa-db-ja.com

ホイップテールを使用したチェックリスト-マルチコマンドを実行できないのはなぜですか?

このコードは、関数の下の行のため、最初の一致に対してのみ実行されます:service httpd startただし、すべてのssh ...行を削除すると、すべての関数からのエコーが表示されます。誰かが私に何が起こっているのか、そして多分私がそれをどのように使うことができるかについての解決策を説明してもらえますか?.

#!/bin/bash
 function s1 {
        echo "running 1 "
        ssh user@server_1_IP service httpd start
}
    function s2 {
        echo "running 2"
        ssh user@server_2_IP service httpd start
} 
function s3 {
        echo "running 3"
        ssh user@server_3_IP service httpd start
}
whiptail --title "Test" --checklist --separate-output "Choose:" 20 78 15 \
"Server1" "" on \
"Server2" "" on \
"Server3" "" on 2>results

while read choice  
do
        case $choice in
                Server1) s1
                ;;
                Server2) s2
                ;;
                Server3) s3
                ;;
                *)
                ;;
        esac
done < results
1
Shimpu

コードでは、ファイルstdinに由来するresultswhile read ...sshの両方に与えられます(s1s2およびs3)。 sshは、最初のループでreadによって読み取られなかったものをすべて食べます。

後でsshで使用するために、ループの前にstdinを保存してみてください。

exec {stdin}<&0
while read choice  
do
        case $choice in
                Server1) s1 <&$stdin ;;
                Server2) s2 <&$stdin ;;
                Server3) s3 <&$stdin ;;
        esac
done < results

または、sshにstdinが必要ない場合は、< /dev/nullを使用します。

1
xhienne