关于从bash脚本中启动脚本的bash语法,我有一个问题。
我的问题是:
我看过以下语法:
#!/bin/bash
python do_something.py > /dev/null 2>&1 &
您能解释一下/dev/null
的内容,以及2>&1
的含义,如果之前已提到/dev/null
那么?
此外,如果我有一行定义如下:
python do_something.py > 2>&1 &
那有什么不同?
如果我在许多路径中有相同的python文件,我怎样才能在启动ps -ef |grep python
后区分每个进程。
当我这样做时,我得到一个所有被称为do_something.py
的进程列表,如果我可以拥有每个pid的完整执行路径字符串,那将是很好的。我怎么能这样做?
注意:启动的python文件正在编写自己的日志文件。
答案 0 :(得分:1)
1)stdout(标准输出)被重定向到/ dev / null,stderr(错误消息)被重定向到标准输出,即控制台。
3)使用 ps auxww 标志,您将在终端窗口和shell脚本中看到输出的完整路径。 “ps manual”:
-w宽输出。使用此选项两次以获得无限宽度。
答案 1 :(得分:1)
数目:
1,2。>
将执行命令(在您的情况stdout
中)执行的python do_something.py
中打印的内容重定向到名为/dev/null
的文件。 /dev/null
是一种黑洞。无论你写什么,它都会消失。
2>&1
将stderr
(fd为2)的输出重定向到stdout
(其fd为1)。
有关重定向的详细信息,请参阅I/O redirection。
有关/dev/null
答案 2 :(得分:1)
好的, diclaimer :我现在无法访问bash,所以我可能错了。
让我们破解你的命令:python do_something.py > /dev/null 2>&1 &
python do_something.py
将运行您的命令
> /dev/null
会将stdout重定向到/ dev / null
2>&1
会将stderr重定向到stdout
&
将分叉您的流程并在后台运行
所以你的命令将忽略stdout / stderr并在后台运行
相当于命令python do_something.py >& /dev/null &
[1] [2]
python do_something.py > 2>&1 &
:
> 2
会将stdout重定向到名为2的文件
>&1
将stdout重定向到stdout(yes stdout to stdout)
&
将分叉您的流程并在后台运行
所以这个命令几乎等同于python do_something.py >2 &
,
它会将输出重定向到名为2的文件(例如:echo 'yes' > 2>&1
)
注意:>&1
的行为可能未指定。
由于您使用&
运行命令,因此您的命令将是fork和
在后台运行,因此我不知道有什么方法可以做到这一点
案件。您仍然可以查看/proc
目录 [3] 以查看
您的命令已运行到哪个目录。
[1] :What is the difference between &> and >& in bash?
[2] :In the shell, what does “ 2>&1 ” mean?
[3] :ls -l /proc/$PROCCESSID/cwd