如何将包含新行的“eval”命令写入一行?

如何将包含新行的“eval”命令写入一行?

由于我需要在 bash 的同一行中设置和使用别名,所以我想使用豪克拉格解决方法

eval 'alias df5=df
df5 -h'

(为了举例,我采用了df和。我知道在这个特定的示例中,可以将整个命令替换为。)df5evaldf -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

但我不确定这是否适合您的用例。 :-)

相关内容