4

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

4a。对于单个受影响的脚本,在 she-bang 之后添加以下行: ~ (set -o igncr) 2>/dev/null && set -o igncr; # 需要注释

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

4

2 回答 2

1

此命令中重要的详细信息

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

是上下文。

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

通常(不是在 cygwin 下)使用set -o igncr将是一个错误(就像试图设置任何其他无效set选项一样。

但是,在 cygwin 下,set这既有意义又有帮助。

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

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

于 2015-05-12T03:12:04.430 回答
0

从脚本中,尝试:

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

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

意识到!这有一个潜在的“陷阱”:

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

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

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

于 2021-09-17T18:16:49.177 回答