linux - Bash 脚本在某些情况下无休止地循环
问题描述
我目前正在玩 bash 并在最后几天编写了一些脚本。我想,我已经完成了,但经过一些测试,似乎当涉及到一个需要用户交互的简单是/否问题时,它会循环。奇怪的是,每当我运行脚本时,它都不会循环。这取决于我如何运行它。所以这是一个示例脚本:
#!/usr/bin/env bash
while true; do
read -rp " test? (y/n): " yn
case $yn in
[Yy]*)
FOO="y"
break
;;
[Nn]*)
FOO="n"
break
;;
*)
echo -e " Please answer yes or no."
echo ""
;;
esac
done
echo "You picked $FOO"
如您所见,它没有做任何特别的事情。如果您键入其他任何内容,它会询问是或否并显示一条消息。如果我像这样运行它(在 Debian/Ubuntu 机器上):
bash foo.sh
或像这样:
chmod 755 foo.sh && ./foo.sh
甚至像这样(相同的脚本,托管在 GitHub Gist 上):
bash <(wget -qO- git.io/JUGDp)
它按预期工作。但是如果我这样运行它,它会循环:
wget -qO- git.io/JUGDp | bash
我对为什么会发生这种情况有一个基本的了解,但即使我的假设是正确的,我该如何预防呢?
解决方案
当你在管道末端运行 Bash 时,它的标准输入连接到管道;因此read
将无法从终端读取。
推荐阅读
- python - 日期时间时区转换添加分钟而不是小时偏移
- swift - 集合视图单元格中的 IndexRow 变量在 reloadData() 后不会更改
- c# - 如何在 linux(ubuntu) 中使用 vscode 调试 asp.net core 3.1
- r - 如何在 R 中绑定子列表
- xamarin.forms - Xamarin 表单:显示警报在 UWP 平台上的 XF 版本 4.6 中不起作用
- node.js - 如何将数据从反应服务器发布到快递服务器?
- xamarin - 如何直接在 XAML 中将 ResourceDictionary 的值与 IValueConverter 绑定?
- java - 如何使用 Intelij 远程调试 EAR?
- java - JavaFX TabPane Tab 从外部控制器中选择
- kiwi-tcms - Fogbugz / Manuscript 与 Kiwi TCMS 的集成