单行heredocument - 可以在 Bash 中吗?

单行heredocument - 可以在 Bash 中吗?

我希望cat在单行中运行heredocument,而不是3行的自然语法(开头符、内容和分隔符)。我这样做的需要主要是为了美观,因为重定向的内容旨在成为手册文本文件的一部分,并且我想在该特定文件中保存尽可能多的行)。

这样做cat <<< TEST > ~/myRep/tiesto tiesto TEST(我通常会分成 3 部分)会导致错误:

tiesto:没有这样的文件或目录

测试:没有这样的文件或目录。

是否有可能在 Bash 中执行单行文档?

答案1

是的,但你会使用这里的字符串而不是一个此处文档

cat >"$HOME/myRep/tiesto" <<<'tiesto'

这会将字符串发送tiesto到其标准输入,并通过标准输出的重定向cat将字符串写入文件。$HOME/myRep/tiesto

请注意,here-strings 不是标准的,但至少由以下实现zsh(它来自哪里,与 的 UNIX 版本同时存在rc,尽管它rc及其衍生物喜欢esakanga不在末尾添加额外的换行符), ksh93bashmkshyash

答案2

您可以使用以下命令将此处文档(而不是此处字符串)放在一行上:

eval $'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST'

从技术上讲,这是一行代码,但$'...'会扩展为再次使用的新的 3 行代码eval

使用eval,您始终可以将任何 shell 代码放在一行中。

对于不支持 的 shell $'...',您可以执行以下操作:

eval "$(printf 'NL="\n"')"; eval "cat << TEST > ~/myRep/tiesto${NL}tiesto${NL}TEST"

或者

eval "$(printf 'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST')"

当然在这里,

echo tiesto > ~/myRep/tiesto

会简单很多。或者对于多行:

printf '%s\n' "line 1" "line 2" > ~/myRep/tiesto

相关内容