Bash 使用变量Shorten命令

Bash 使用变量Shorten命令,bash,shell,Bash,Shell,我经常使用以下命令(实际路径较长): 但现在我想把它缩短成这样: log="$(>>/root/error.log 2>&1 >>/root/out.log)" 但当我在另一个文件中使用该变量时,它根本不起作用: apt-get update -y ${log} 你知道怎么让它工作吗 编辑: 此时,命令如下所示: apt-get update -y >>/root/error.log 2>&1 >>/root/o

我经常使用以下命令(实际路径较长):

但现在我想把它缩短成这样:

log="$(>>/root/error.log 2>&1 >>/root/out.log)"
但当我在另一个文件中使用该变量时,它根本不起作用:

apt-get update -y ${log}
你知道怎么让它工作吗



编辑: 此时,命令如下所示:

apt-get update -y >>/root/error.log 2>&1 >>/root/out.log

。。。而且工作正常。但我想要一个简短的版本,比如:

apt-get update -y ${log} 


例如,您试图封装的不是命令。它是要执行的命令的重定向部分

这是行不通的。您可以使用重定向中变量的文件名,但不能使用
>
&1
部分

最简单的解决方案是创建一个函数

execute_and_log()
{
  "$@" >>/root/out.log 2>>/root/error.log
}

execute_and_log any_command with args
请注意,
“$@”
(双引号在这里非常重要)扩展为当前上下文中所有位置参数的列表(可能根本不是参数,也可能扩展为零),每个参数都受到保护,不会进一步分词,就像被称为
“$1”“$2”…

请注意,
eval
可以用于在对命令执行扩展后执行命令,但尽管可以正确使用,但这是一个棘手的问题,应该被视为最后的手段,因为通常有更简单、更不容易出错的解决方案

另一种可能性是:

main_log="long/path/to/file1"
err_log="long/path/to/file2"
apt-get update -y >>"$main_log" 2>>"$err_log"

您试图封装的不是命令。它是要执行的命令的重定向部分

这是行不通的。您可以使用重定向中变量的文件名,但不能使用
>
&1
部分

最简单的解决方案是创建一个函数

execute_and_log()
{
  "$@" >>/root/out.log 2>>/root/error.log
}

execute_and_log any_command with args
请注意,
“$@”
(双引号在这里非常重要)扩展为当前上下文中所有位置参数的列表(可能根本不是参数,也可能扩展为零),每个参数都受到保护,不会进一步分词,就像被称为
“$1”“$2”…

请注意,
eval
可以用于在对命令执行扩展后执行命令,但尽管可以正确使用,但这是一个棘手的问题,应该被视为最后的手段,因为通常有更简单、更不容易出错的解决方案

另一种可能性是:

main_log="long/path/to/file1"
err_log="long/path/to/file2"
apt-get update -y >>"$main_log" 2>>"$err_log"

你在写什么?你好像没有命令?或者您正试图将重定向保存到一个变量,因为您不能这样做。你可以保存路径并使用变量,但你必须在变量扩展之前写入重定向。你是否尝试定义别名?@Badacadara,这也不起作用我编辑了主要帖子,解释了我试图做的事情:)你是从哪里写的?你好像没有命令?或者您正试图将重定向保存到一个变量,因为您不能这样做。您可以保存路径并使用变量,但您必须在变量扩展之前写入重定向。您是否尝试定义别名?@Badacadara,这也不起作用我编辑了主帖并解释了我试图做的事情:)我编辑了主帖并解释了,我想做的事:)你想做的事不能以你希望的方式实现。不要尝试将重定向符号放在变量中,它将不起作用,除非您使用我建议不要使用的
eval
main\u log=“long/path/to/file1”err\u log=“long/path/to/file2”apt get update-y>“$main\u log”2>“$err\u log”
对我来说是一个很好的解决方案,谢谢!因此,所有输出将存储到main.log,所有错误将存储到error.log?@Aeris是的,这就是应该发生的事情。如果您想在每次执行命令时覆盖日志,而不是附加到日志,请使用
而不是
>
。我编辑了主要帖子,解释了我试图做的事情:)您试图做的事情无法以您希望的方式实现。不要尝试将重定向符号放在变量中,它将不起作用,除非您使用我建议不要使用的
eval
main\u log=“long/path/to/file1”err\u log=“long/path/to/file2”apt get update-y>“$main\u log”2>“$err\u log”
对我来说是一个很好的解决方案,谢谢!因此,所有输出将存储到main.log,所有错误将存储到error.log?@Aeris是的,这就是应该发生的事情。如果要在每次执行命令时覆盖日志而不是附加到日志,请使用
而不是
>
main_log="long/path/to/file1"
err_log="long/path/to/file2"
apt-get update -y >>"$main_log" 2>>"$err_log"