保留Bash变量中的解释



我正在尝试在Bash变量中保留解释。

示例

当我在命令提示符下运行以下行时。

rm aaa 2>> error_file ; echo '<br><br>' >> error_file

我得到以下(这就是我想要的):

rm: cannot remove `aaa': No such file or directory

如果我把错误处理代码放在一个变量中,它就会爆炸。

ERROR_HAN="2>> error_file ; echo '<br><br>' >> error_file"
rm aaa $ERROR_HAN
rm: cannot remove `"2>>"': No such file or directory

我试过引用很多方法,但没有成功。我似乎无法为变量的2>>部分保留解释。

使用eval:

eval rm aaa ${ERROR_HAN}
不要将命令放在变量中。使用一个函数:
rm_error() {
    rm "$@" 2>> error_file 
    echo '<br><br>' >> error_file
}
rm_error file1 file2 file3

另请参阅:BashFAQ/050:我试图将命令放入变量中,但复杂的情况总是失败!

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

更好地在块上重定向,并使用过程替换:

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

最后只写一次<br><br>的另一种方法:

{
    rm aaa
    # ... other commands
} 2> >(
    if read -r LINE; then
        while
            echo "$LINE"
            read -r LINE
        do
            continue
        done
        echo '<br><br>'
    fi >> error_file
)

这一个即使没有错误也会写入<br><br>,并且在最后只写一次:

{
    rm aaa
    # ... other commands
} 2>> error_file
echo '<br><br>' >> error_file

请注意,如果您只使用一个命令(如rm),则不必将其放置在块中,只需使用rm aaa 2>> >( ...即可。我想你只需要一行:

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
}

最新更新