![如何将包含新行的“eval”命令写入一行?](https://linux22.com/image/172856/%E5%A6%82%E4%BD%95%E5%B0%86%E5%8C%85%E5%90%AB%E6%96%B0%E8%A1%8C%E7%9A%84%E2%80%9Ceval%E2%80%9D%E5%91%BD%E4%BB%A4%E5%86%99%E5%85%A5%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
由于我需要在 bash 的同一行中设置和使用别名,所以我想使用豪克拉格的解决方法:
eval 'alias df5=df
df5 -h'
(为了举例,我采用了df
和。我知道在这个特定的示例中,可以将整个命令替换为。)df5
eval
df -h
不过我更愿意将此命令写成一行。
如何将eval
包含新行的命令写入一行?
我没有成功尝试以下一行命令:
eval 'alias df5=df\ndf5 -h'
。错误-bash: alias: -h: not found
alias df5=df ; df5
。错误:No command 'df5' found
alias df5=df && df5
(建议来自赛勒斯)。错误:No command 'df5' found
答案1
由于您正在使用bash
:
eval $'alias df5=df\ndf5 -h'
这$'...'
是一个“C 字符串”,在将其传递给 之前bash
会将其中的 展开\n
为文字换行符eval
。
必须小心,因为其他反斜杠序列也可能被扩展。请参阅手册QUOTING
的后半部分bash
。
答案2
有几种解决方案,但所有解决方案都应该取决于用其他字符编写换行符的想法。第一个可能的解决方案,一个可移植的解决方案(非常旧)是在变量内获取换行符:
nl='
'
eval 'alias df5=df'"$nl"'df5 -h'
将显式换行符分配给 var 可能看起来很奇怪,如果是这种情况,我们可以使用:
Ansi-C 引用(ksh、bash、zsh):
nl=$'\n'
printf(大多数 shell):
eval "$(printf "nl='\n'")"
但是,这两个想法可以直接用于定义别名:
eval $'alias df5=df\ndf5 -h'
eval "$(printf "alias 'df5=df\ndf5 -h'")"
但是,当然,您可以忘记换行符,并将别名定义为:
alias df5=df && df -h
但我不确定这是否适合您的用例。 :-)