パイプで流し込んだscript中にselect文があると壊れ
こんなコードがあったとする
code:script.sh
select i in Red Green Blue
do
case $i in
Red) echo "Red!!"; break ;;
Green) echo "Green!!"; break ;;
Blue) echo "Blue!!"; break ;;
*) echo "Bad select!!" ;;
esac
done
if -e ~/.bashrc ; then
echo "You have .bashrc"
fi
このとき、上は成功するが下は失敗する
/icons/pass.iconcurl https://scrapbox.io/api/code/takker/%E3%83%91%E3%82%A4%E3%83%97%E3%81%A7%E6%B5%81%E3%81%97%E8%BE%BC%E3%82%93%E3%81%A0script%E4%B8%AD%E3%81%ABselect%E6%96%87%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E5%A3%8A%E3%82%8C/script.sh > test.sh && bash test.sh
/icons/fail.iconcurl https://scrapbox.io/api/code/takker/%E3%83%91%E3%82%A4%E3%83%97%E3%81%A7%E6%B5%81%E3%81%97%E8%BE%BC%E3%82%93%E3%81%A0script%E4%B8%AD%E3%81%ABselect%E6%96%87%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E5%A3%8A%E3%82%8C/script.sh | bash
次のような出力がなされる
code:log
1) Red
2) Green
3) Blue
#? 1) Red
2) Green
3) Blue
#? Bad select!!
#? Bad select!!
#?
こうなってしまうのは、パイプ (shell)によるbashへのコード入力がselect文 (bash)にてuserの入力と認識されてしまうからだろう
select文 (bash)を使ったscriptはパイプではなく、一旦ファイルに書き込んでから実行しないといけない
#2021-10-08 15:46:33