我有这个命令在我想安装的一些软件中运行校验和:
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"