0

我正在尝试在 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>>对变量部分的解释。

4

3 回答 3

0

使用eval

eval rm aaa ${ERROR_HAN}
于 2013-09-04T13:54:01.847 回答
0

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

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

rm_error file1 file2 file3

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

于 2013-09-04T13:55:22.227 回答
0

您将对不安全的内容使用 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
}
于 2013-09-04T13:57:26.483 回答