如何找出为什么 `bash simple_script.sh` 有效但 `bash < simple_script.sh` 无效?

如何找出为什么 `bash simple_script.sh` 有效但 `bash < simple_script.sh` 无效?

我有一个非常简单的脚本,simple_script.sh由以下三行组成

bpeek 123450
bpeek 123451
bpeek 123452

如果我跑

$ bash simple_script.sh

中的所有三个bpeek命令simple_script.sh都被执行。

但如果我跑

$ bash < simple_script.sh

bpeek...仅执行第一个命令1脚本的运行成功终止(即$?等于 0)。

相反,如果我要替换bpeek/bin/echo(例如),则两种运行方式simple_script.sh都会导致执行所有三个命令。

我很快补充说,我以前从未观察到这种差异(这两种运行 bash 脚本的方式之间);我上面描述的差异与命令bpeek(它是IBM 的 LSF 套件)。 (需要明确的是,“裸”命令bpeek解析为一个文件,而不是一个函数或别名,并将file该文件报告为“ELF 64 位 LSB 可执行文件”。)

我对这种差异感到困惑,想弄清楚为什么它发生了。

我的问题是:我该如何解释这种差异?


当然,我没有理由simple_script.sh这样调用:

$ bash < simple_script.sh

我在这里所做的只是为了简化这个问题。然而,在实践中,我希望能够运行以下形式的命令

<PIPELINE> | bash

...where<PIPELINE>写入stdout以下形式的多个命令bpeek <JOBID>(每行一个命令),我希望执行所有这些命令,而不仅仅是第一个命令。

我希望通过更好地了解正在发生的事情,我将能够以<PIPELINE>确保所有命令得到执行的方式进行修改。

此外,我只是想了解到底发生了什么。 (毕竟,我总是可以接受我的无知,并诉诸于bash <( <PIPELINE> )。)

FWIW:问题并不特定于bash.如果我bashzsh上面的替换,会发生完全相同的事情。


1更准确地说,只有第一个命令的输出bpeek显示在我的终端上。

相关内容