从文件读取与从管道读取时,shell 程序的行为不同



我为个人用途制作了一个bash脚本,该脚本使用适当的选项设置了Selenium网络驱动程序。这是它的原始链接 - https://del.dog/raw/edivamubos

如果我在将它写入文件后使用 curl 执行此脚本,例如..

curl https://del.dog/raw/edivamubos -o test.sh && 
chmod u+x test.sh && 
bash test.sh

脚本可以完美地工作,因为它的预期工作

但通常我喜欢直接使用 curl 执行脚本,所以当我这样做时。

curl https://del.dog/raw/edivamubos | bash

脚本工作得很奇怪,它不断循环重复第22,23和29行。 我简直不敢相信,所以我测试了 3,4 次并且可以确认。

现在

  1. 在两种情况下,相同的脚本行为不同的原因是什么?
  2. 我该如何修复它(即即使在直接执行它而不写入文件的情况下使其正常工作(

编辑- 如果有人想要,他们可以在谷歌colab中快速测试(以防有人打算测试但不想在本地安装任何软件包(。我之所以提到这件事,是因为您将无法在任何bash IDE中正确重现它。

当你通过管道将脚本传送到 bash 时,这个命令(第 24 行(:

read -p "Enter your input : " input

读取下一行(即第 25 行,case $input in(,因为 Bash 的 stdin 连接到 curl 的 stdout,并且read读取与 Bash 相同的描述符。

为了避免这种情况,开发人员可以更改脚本,以便从/dev/tty(即控制终端(读取所有输入。 例如:

read -p 'prompt' input </dev/tty

或者用户可以使用以下方法之一,以便read从终端读取,而不是从中读取的描述符。

bash -c "$(curl link)"
bash <(curl link)

最新更新