从bash启动脚本并指导输出

时间:2016-08-30 13:24:19

标签: python linux bash

关于从bash脚本中启动脚本的bash语法,我有一个问题。

我的问题是:

  1. 我看过以下语法:

    #!/bin/bash
    python do_something.py > /dev/null 2>&1 &
    

    您能解释一下/dev/null的内容,以及2>&1的含义,如果之前已提到/dev/null那么?

  2. 此外,如果我有一行定义如下:

    python do_something.py > 2>&1 &
    

    那有什么不同?

  3. 如果我在许多路径中有相同的python文件,我怎样才能在启动ps -ef |grep python后区分每个进程。 当我这样做时,我得到一个所有被称为do_something.py的进程列表,如果我可以拥有每个pid的完整执行路径字符串,那将是很好的。我怎么能这样做?

  4. 注意:启动的python文件正在编写自己的日志文件。

3 个答案:

答案 0 :(得分:1)

1)stdout(标准输出)被重定向到/ dev / null,stderr(错误消息)被重定向到标准输出,即控制台。

  • 1> filename:将stdout重定向到文件“filename。”
  • 1>> filename:重定向并将stdout附加到文件“filename”。
  • 2> filename:将stderr重定向到文件“filename。”
  • 2>> filename:重定向并将stderr附加到文件“filename”。
  • &> filename:将stdout和stderr重定向到文件“filename”。

3)使用 ps auxww 标志,您将在终端窗口和shell脚本中看到输出的完整路径。 “ps manual”:

-w宽输出。使用此选项两次以获得无限宽度。

答案 1 :(得分:1)

数目:

1,2。>将执行命令(在您的情况stdout中)执行的python do_something.py中打印的内容重定向到名为/dev/null的文件。 /dev/null是一种黑洞。无论你写什么,它都会消失。

2>&1stderr(fd为2)的输出重定向到stdout(其fd为1)。

有关重定向的详细信息,请参阅I/O redirection

有关/dev/null

的详情,请参阅this链接

答案 2 :(得分:1)

好的, diclaimer :我现在无法访问bash,所以我可能错了。

  1. 让我们破解你的命令: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]

  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的行为可能未指定。

  3. 由于您使用&运行命令,因此您的命令将是fork和 在后台运行,因此我不知道有什么方法可以做到这一点 案件。您仍然可以查看/proc目录 [3] 以查看 您的命令已运行到哪个目录。

  4. [1] What is the difference between &> and >& in bash?
    [2] In the shell, what does “ 2>&1 ” mean?
    [3] ls -l /proc/$PROCCESSID/cwd