修改 2>&1 以便输出转到特定文件,并且任何错误或其他输出都转到我可以监视的日志文件?

Dou*_*Fir 2 shell redirection command-line tail

我正在阅读这篇文章,但我并不完全理解答案。

我想知道我是否可以修改它,它叫什么,命令重定向?

我想要什么:

  1. 不要挂起,使用 & 符号&继续执行下一个命令
  2. 将命令生成的数据输出到文件data.json
  3. 任何问题、错误消息或运行命令的问题,将它们输出到 bqlog.txt

这可能吗?

例如我目前有这个命令:

bq query --max_rows=1000000 --use_legacy_sql=false --format=json --batch=true --headless=true 'select * from `ga4-extract.analytics_123456789.events_'"$RUNDATE"'`;' > data.json
Run Code Online (Sandbox Code Playgroud)

大约 30 分钟后失败,我看不到输出或问题是什么。这是在 github actions runner 上,工作流的控制台输出仅给出失败状态,但对于此工作流来说,没有控制台输出指示错误。

我想修改我的命令,以便可以像我已经拥有的那样输出到 data.json,但也可以继续下一步监视 bqlog.txt 文件tail -F bqlog.txt

LPC*_*hip 6

是的,这是可能的。

2>&1含义如下:

2 : stderr
> : output redirect
& : copy file descriptor
1 : file descriptor 1
Run Code Online (Sandbox Code Playgroud)

因此:stderr 输出重定向到文件描述符 1 (stdout) 所指向的任何位置。默认值:屏幕。

这意味着,stderr 被输出到屏幕上。

您的问题是,如何将命令的输出重定向到文件 1,并将 stderr 重定向到另一个文件?

你的命令变成:

command >output1.txt 2>output2.txt
Run Code Online (Sandbox Code Playgroud)

要使用您自己的代码,您可以编写(我添加了 Enter 以避免滚动条并使其可读。没有 Enter 和滚动条的相同命令如下:

bq query --max_rows=1000000 --use_legacy_sql=false --format=json 
   --batch=true --headless=true 
   'select * from `ga4-extract.analytics_123456789.events_'"$RUNDATE"'`;
   ' >data.json 2>bglog.txt
Run Code Online (Sandbox Code Playgroud)

或不输入:

bq query --max_rows=1000000 --use_legacy_sql=false --format=json --batch=true --headless=true 'select * from `ga4-extract.analytics_123456789.events_'"$RUNDATE"'`;' >data.json 2>bglog.txt
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有输出,此命令将创建一个空文件,并且它将在每个命令上覆盖该文件。如果要追加,请使用 >> 代替。例如:

>>data.json 2>>bglog.txt
Run Code Online (Sandbox Code Playgroud)

此外,您可能还需要添加以下内容:

echo --------------------- >> data.json
echo --------------------- >> bglog.txt
Run Code Online (Sandbox Code Playgroud)

这会将 ---- 写入两个文件,帮助您查看旧执行和新执行何时发生。

  • 默认情况下,stderr 会记录到控制台,您无需为此执行任何操作。 `>txt` 仅记录正常输出。通过使用 `2>&1` 你说,我希望 stderr 被重定向到我的输出已经是什么。所以 `>txt 2>&1` 基本上使 stderr 也输出到 txt (4认同)