类似的问题,但没有答案:我们如何运行存储在变量中的命令?
如何在 bash 脚本中执行以下操作?
error=">&2"
echo 'something went wrong' $error
代替
echo 'something went wrong' >&2
为什么?
因为如果您输入错误>2&
,它会正常工作,但会将错误消息写入名为2
.
答案1
就像他们在评论中所说的那样,你真的不知道。
好吧,你可以用 来做到这一点eval
,但是你会遇到引用/转义所有内容的麻烦别的在该命令行上。
不过,您可以使用函数做一些事情:在重定向下运行给定的简单命令;或者只是向 stderr 写入一条消息:
#!/bin/bash
tostderr() {
"$@" >&2
}
warn() {
local IFS=" "
printf "%s\n" "$*" >&2
}
tostderr printf "warning: %s\n" "something happened"
warn another thing to warn about
强调简单的命令在第一个上,它不是eval
,并且你不能在命令中使用 shell 语法。例如,tostderr foo | bar
它仅重定向输出foo
(通过管道到 stderr),并且tostderr (foo | bar)
不起作用。
如果您使用 zsh,并且确实想要这样做,您可以使用全局别名来添加重定向(但有些人可能认为这接近混淆编码):
#/usr/bin/zsh
alias -g TOSTDERR='>&2'
echo something bad happened TOSTDERR