我希望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
及其衍生物喜欢es
或akanga
不在末尾添加额外的换行符), ksh93
,bash
,mksh
和yash
。
答案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