“此处文档”作为单行命令?

“此处文档”作为单行命令?

我有这个命令在我想安装的一些软件中运行校验和:

echo "85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd install.sh" | sha256sum -c

但我想将它与sha256sum命令一起使用第一的。所以我们使用heredoc来实现:

sha256sum -c << EOF
85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd  install.sh
EOF

但现在我希望这一切都在一行......所以我尝试:

sha256sum -c << EOF ; 85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd  install.sh ; EOF

但这不起作用。但不应该如果分号;意味着“我们要运行另一个命令”,它会起作用吗?

我们可以按这个顺序得到它,但用不同的方式写在一行上吗?如果不是,为什么我们不能告诉它在每一行上做什么,而是在一行上做什么?

答案1

但如果分号 ; 不应该起作用吗?意思是“我们要运行另一个命令”?

不,正是因为;这意味着“我们将运行另一个命令”,但您将其插入到单个命令的中间。你的命令是:

sha256sum -c << EOF
85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd  install.sh
EOF

这是一个命令,不是很多。您不能用分号来打破它,并且此处文档的工作方式假定单独的行,因此您不能在单行上执行此处文档。然而,有些 shell,例如bash,支持这里是字符串这可能就是您正在寻找的:

sha256sum -c <<< "85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd  install.sh"

这里的字符串只是将字符串作为输入传递给命令(或文件描述符,但不用介意)的快速方法。您可以将上面的内容视为等效的

printf '%s\n' "85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd install.sh" | sha256sum

答案2

我们可以保持代码的可移植性,sha256sum命令移至左列(尽管不在 之前echo),如下所示:

echo "85762db0edc00ce19a2cd5496d1627903e6198ad850bbbdefb2ceaa46bd20cbd install.sh" \
| sha256sum -c

sha256sum这解决了远离右侧、远离的可读性问题echo。使用该代码的人现在看到了这一点:

答案3

分号和换行符在某些地方可以互换,例如在单个命令的末尾。但每个地方的情况肯定不一样。

所以这些是相同的:

echo one
echo two
# and
echo one; echo two;

但是,虽然这些有效:

if true; then
   echo hi
fi
echo foo |
   wc

这些不:

if true; then; echo hi; fi
echo foo |; wc

这里的文档是一种更特殊的东西,它们基于行工作,shell 之外的语法结构

这意味着您可以执行以下操作:

# semicolon and another command before the here-doc
cat <<EOF; echo there
hello
EOF

# pipeline continues past the here-doc
cat <<EOF |
hello
EOF
sed -e 's/$/ there/'

# multiple here-docs used on the same line
cat <<THIS; cat <<THAT
hello
THIS
there
THAT

所以,你的命令行

sha256sum -c << EOF ; 8576...  install.sh ; EOF

让 shell 等待以 结尾的此处文档END,然后sha256sum使用此处文档作为输入运行,然后运行命令8576...EOF。对于后两者,您可能会收到“命令未找到”错误。

作为特登在回答中说,here-string 是here-doc 的单行版本,它适用于大多数功能丰富的 shell,但不适用于更严格限制于标准 shell 语言的 shell(例如 Debian 的 Dash 和 Busybox 的 sh)。

sha256sum -c <<< "8576...  install.sh"

相关内容