Bash 用于在脚本中设置 SHELLOPTS 的子 shell

Bash subshell for setting SHELLOPTS in a script

这个问题不是特定于 cygwin 的。但是,在 cygwin 邮件存档 https://cygwin.com/ml/cygwin-announce/2010-08/msg00015.html 中有各种用于设置 cygwin 特定 igncr shellopt 变量的说明,其中之一是说明:

4a. For a single affected script, add this line just after the she-bang: ~ (set -o igncr) 2>/dev/null && set -o igncr; # comment is needed

我知道 set -o igncr 在 SHELLOPTS 中设置了 igncr。但是,我不明白为什么该指令还包括在子 shell 中调用它。据我了解,子 shell 的变量和环境不会留在父进程中。它有什么用?

此命令中material的详细信息

(set -o igncr) 2>/dev/null && set -o igncr

是上下文。

设想一个 shell 脚本设计用于 运行 在非 Windows 机器上以及在 cygwin 中。

通常(不在 cygwin 下)使用 set -o igncr 会出错(因为试图设置任何其他无效的 set 选项也是如此。

然而,在 cygwin 下,set 既有意义又有帮助。

那么如何编写一个在两个地方都运行的脚本呢?您需要对当前环境进行测试。您可以检查特定的环境变量、特定的路径等。(这类似于从浏览器嗅探和特性测试的转移)您可以只检查当前环境是否支持您尝试设置的选项。

所以尝试设置它,但如果它不起作用会抛出错误,所以尝试在子 shell 中设置它(并将错误输出扔到 /dev/null 以忽略它) 然后如果(且仅当)设置成功 (&&) 然后在当前 shell 环境中进行设置。

从脚本中尝试:

[[ $(uname -o) =~ Cygwin ]] && echo "this is Cygwin" || echo "this is not Cygwin"

用适当的东西替换这个三元结构的2个端点;设置一个你可以查看的变量等

注意!这有潜力 'gotcha':

如果 && 条件的右侧具有非零退出状态,它将默认为 or (||) 表达式。

[[ cond ]] && op1 || op2 ➜ op2 will be selected if op1 fails.

要点:注意 op1 操作。确保它以 0 状态代码退出,否则您可能会收到误报。事实上,如果 cond 为真并且 op1 以非零状态退出,您将同时执行 op2 和 op2。