我正在尝试在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
}