在Bash变量中保留解释

在Bash变量中保留解释,bash,quoting,interpretation,Bash,Quoting,Interpretation,我试图在Bash变量中保留解释 范例 在命令提示下运行以下行时 rm aaa 2>> error_file ; echo '<br><br>' >> error_file 如果我把错误处理代码放在一个变量中,它就会爆炸 ERROR_HAN="2>> error_file ; echo '<br><br>' >> error_file" rm aaa $ERROR_HAN rm: cannot rem

我试图在Bash变量中保留解释

范例

在命令提示下运行以下行时

rm aaa 2>> error_file ; echo '<br><br>' >> error_file
如果我把错误处理代码放在一个变量中,它就会爆炸

ERROR_HAN="2>> error_file ; echo '<br><br>' >> error_file"
rm aaa $ERROR_HAN
rm: cannot remove `"2>>"': No such file or directory
ERROR\u HAN=“2>>错误文件;回显'

'>>错误文件' rm aaa$ERROR\u HAN rm:无法删除“%2>>”:没有这样的文件或目录
我试着引用了很多方法,但没有成功。我似乎无法保留变量的
2>
部分的解释。

使用
eval

eval rm aaa ${ERROR_HAN}

不要将命令放在变量中。改用函数:

rm_error() {
    rm "$@" 2>> error_file 
    echo '<br><br>' >> error_file
}

rm_error file1 file2 file3
rm_错误(){
rm“$@”2>>错误\u文件
回显'

'>>错误文件 } rm_错误文件1文件2文件3

另请参见:

对于不安全的情况,您将不得不使用eval

最好在块上重定向它,并使用进程替换:

{
    rm aaa
    # ... other commands
} 2> >(
    while read -r LINE; do
        echo "$LINE"
        echo '<br><br>'
    done >> error_file
)
另一个:

EFILE=/path/to/error_file
rm aaa 2> >(read -r LINE && echo "$LINE"$'\n''<br><br>' >> "$EFILE")
EFILE=/path/to/error\u文件
rm aaa 2>>(读取-r行和回显“$LINE”$”\n“

>>“$EFILE”)
命令特定功能:

EFILE=/path/to/error_file

function log_error_to_file {
    read -r LINE && echo "$LINE"$'\n''<br><br>' >> "$EFILE"
}

rm aaa 2> >(log_error_to_file)
another_command 2> >(log_error_to_file)
EFILE=/path/to/error\u文件
函数日志\u错误\u到\u文件{
读取-r行和回显“$LINE”$”\n“

”>“$EFILE” } rm aaa 2>>(将错误记录到文件) 另一个\u命令2>>(将\u错误\u记录到\u文件)
多行:

function log_error_to_file {
    while read -r LINE; do
        echo "$LINE"
        echo '<br><br>'
    done >> error_file
}
函数日志\u错误\u到\u文件{
当读取-r行时;执行
回音“$LINE”
回音'

' 完成>>错误\u文件 }
谢谢,看起来效果不错。不知道为什么konsolebox觉得它不安全这不仅仅是重新评估${ERROR_HAN}的内容,它还重新评估整个命令行,导致许多令人困惑的问题,如需要双转义特殊字符等。此外,如果命令的任何部分是动态生成的(例如文件名),如果它包含shell元字符,它们可能会以令人困惑和/或危险的方式被误解。如果您愿意在命令的开头(而不仅仅是结尾)添加一些内容(如
eval
),那么最好使用包装函数。谢谢,我正在尝试创建一个变量,可以附加到日常批处理作业中每个命令行的末尾,以便每个命令都可以执行或将特定错误写到文件中。@MikeT您仍然可以从命令行执行。只需在
.bashrc
(或类似文件)中添加函数定义,下次打开终端时,
rm\u error
命令将可用,谢谢,但我正在尝试将一个函数附加到许多不同命令的末尾。因此,如果任何命令抛出错误,函数将捕获它。谢谢,我正在尝试创建一个变量,可以附加到日常批处理作业中每个命令行的末尾,以便每个命令都将执行或将特定错误注销到file@MikeT换个函数怎么样?请参阅我的更新的最后一部分。@MikeT问题是如何将每一行发送到错误文件?是否应将


添加到每个端点,或仅在每个命令之后添加?e、 g.一个用于
rm
,另一个用于
另一个\u命令
,等等。我尝试了该函数并收到以下消息:$/test1+EFILE=/tmp/reports\u cron+rm aaa++log\u error\u to\u file++read-r LINE+set+x$++echo'rm:无法删除'aaa'''':没有这样的文件或目录

''我将在每个响应的末尾添加“

”,这样当我通过html电子邮件发送给我时,它不会一起运行。进一步检查后,所有代码示例似乎都可以正常工作,但我包括set-x和set+x的情况除外。不能说我以前见过。谢谢你,康索盒子!!
rm aaa 2>> >(read -r LINE && echo "$LINE"$'\n''<br><br>' >> error_file)
EFILE=/path/to/error_file
rm aaa 2> >(read -r LINE && echo "$LINE"$'\n''<br><br>' >> "$EFILE")
EFILE=/path/to/error_file

function log_error_to_file {
    read -r LINE && echo "$LINE"$'\n''<br><br>' >> "$EFILE"
}

rm aaa 2> >(log_error_to_file)
another_command 2> >(log_error_to_file)
function log_error_to_file {
    while read -r LINE; do
        echo "$LINE"
        echo '<br><br>'
    done >> error_file
}