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"