在这个BASH代码段中,行开头的感叹号在做什么?

在这个BASH代码段中,行开头的感叹号在做什么?,bash,shell,Bash,Shell,我了解C-shell和BASH中的历史扩展,但我不明白为什么在我正在查看的某个源代码的代码段中使用了带有read命令行上的感叹号: #!/bin/bash set -e . "$(dirname "$0")/includes.sh" ! read -d '' SOME_VAR <<"EOT" some ASCII art EOT echo -e "\033[95m$SOME_VAR\033[0m" #/bin/bash set-e . “$(dirname“$0”)/i

我了解C-shell和BASH中的历史扩展,但我不明白为什么在我正在查看的某个源代码的代码段中使用了带有
read
命令行上的感叹号:

#!/bin/bash

set -e

. "$(dirname "$0")/includes.sh"

! read -d '' SOME_VAR <<"EOT"
  some ASCII art
EOT

echo -e "\033[95m$SOME_VAR\033[0m"
#/bin/bash
set-e
. “$(dirname“$0”)/includes.sh”

! read-d''SOME_VAR如果管道返回非零退出状态(基本上是如果命令失败),则
set-e
命令告诉bash退出

否定退出状态,但也会抑制
set-e
的效果。其思想是,如果命令作为条件的一部分执行,则不希望终止shell。如果前面有
,shell有效地假设它是作为一个条件执行的(即使结果被忽略)

引用bash手册:

如果失败的命令是 紧跟在“while”或“until”关键字后面的命令列表,零件 在“if”语句中执行的任何命令的一部分 “&&”或“| |”列表,但最后一个“&&”或“| |”后面的命令除外, 管道中的任何命令,但最后一个命令除外,或者如果该命令返回 状态正在用“!”反转

(在此上下文中,
与历史记录替换无关,这是正确的。)

内置的
读取的返回代码为

零,除非遇到文件结尾,
read
超时(在这种情况下为 大于128),发生变量分配错误, 或者提供了无效的文件描述符作为-u的参数


这里的相关案例是文件末尾。使用
谢谢,重定向
read
的输入,我阅读了
set-e
的手册页详细信息,但最后一行没有显示。我使用防御性编程,但它在这里是多余的吗,即
SIGHUP
SIGINT
命令无法执行?你能帮我理解为什么第一个EOT是双引号的吗?谢谢我刚刚更新了我的答案,解释了
阅读
如何会(几乎肯定会)“失败”。
中的双引号你太棒了,基思-再次感谢。我以前见过你的答案,你的答案很有帮助。