Bash 脚本 - 运行进程并发送到后台(如果好的话),否则

问题描述 投票:0回答:2

我需要启动一个 Golang Web 服务器并让它通过 Bash 脚本在后台运行。 如果有问题的脚本在语法上是正确的(大多数情况下都是如此),那么只需发出一个

go run /path/to/index.go &

但是,我必须考虑到 index.go 有某种错误的可能性。 我应该解释一下,在 Golang 中,这是“琐碎”的事情,就像导入一个您随后无法使用的模块一样。 在这种情况下,

go run /path/to/index.go
位将返回错误消息。 在终端中,这将类似于

index.go:4:10: expected...

我需要做的是以某种方式更改上面的命令,以便我可以将任何错误消息汇集到文件中以供稍后检查。 我在

go run /path/to/index.go >> errors.txt
上尝试了不同位置的终止 & 变体,但没有成功。

我怀疑有一种 bash 方法可以通过一些明智地使用大括号/括号等来改变命令评估的优先级来做到这一点。但是,这远远超出了我的 Bash 能力。

更新

几分钟后...经过几次实验,我发现这可行

go run /path/to/index.go &> errors.txt &

除了我实际上不明白它为什么起作用之外,还有一个问题是,当命令完成时,它会生成一个 0 字节的errors.txt 文件,而 Golang 不会抛出任何错误消息。发生了什么以及如何改进?

bash http-redirect ubuntu-14.04
2个回答
2
投票

摘自

man bash

重定向标准输出和标准错误

   This construct allows both the standard output (file descriptor 1) and the standard error output (file descriptor 2) to be redirected to the file whose name is the expansion of word.   

   There are two formats for redirecting standard output and standard error:

          &>word
   and
          >&word

   Of the two forms, the first is preferred.  This is semantically equivalent to

          >word 2>&1

附加标准输出和标准错误

   This construct allows both the standard output (file descriptor 1) and the standard error output (file descriptor 2) to be appended to the file whose name is the expansion of word.

   The format for appending standard output and standard error is:

          &>>word

   This is semantically equivalent to

          >>word 2>&1

1
投票

Narūnas K 的回答涵盖了

&>
重定向起作用的原因。

无论如何创建该文件的原因是因为 shell 甚至在运行相关命令之前就创建了该文件。

您可以通过尝试

no-such-command > file.out
来看到这一点,并看到即使 shell 因
no-such-command
不存在而出错,文件也会被创建(在该测试中使用
&>
将在文件中获取 shell 的错误)。

这就是为什么您无法执行诸如

sed 'pattern' file > file
之类的操作来就地编辑文件。

© www.soinside.com 2019 - 2024. All rights reserved.