我想运行很多 python 脚本并保存它们的输出。因为在终端里一一运行太麻烦了。根据建议,我决定使用 shell 脚本 (.sh)。
为了简化问题,假设我有两个要运行的 python 脚本(print1.py
和print2.py
)。脚本print1.py
输出编号为 1,脚本print2.py
输出编号为 2。
如果不使用shell脚本(即单独输入命令),我可以获得想要的结果。
如果不使用 shell 脚本,我会使用的命令是
$ nohup python print1.py &> 1.txt &
$ nohup python print2.py &> 2.txt &
分别将输出重定向到1.txt
和2.txt
。所以1.txt
将包含一个数字 1,并且2.txt
将包含一个数字 2。如果我在终端中分别输入这两个命令,效果很好。这就是我想要的。
使用 shell scipt,我无法得到我想要的东西(重定向似乎无法正常工作)。
但是,如果我使用 shell 脚本,即command.sh
:
#! /bin/sh
nohup python print1.py &> 1.txt &
nohup python print2.py &> 2.txt &
我输入
$ sh command.sh
跑步command.sh
。输出不是我所期望的。1.txt
并将2.txt
被创造,但它们什么也不包含。还将创建一个nohup.out
文件,其中包含数字 1 和 2。
终端上显示的输出是
$ nohup: appending output to 'nohup.out'
nohup: appending output to 'nohup.out'
这个答案提示同#! /bin/sh
,有些shell可能看不懂&>
。所以我也尝试#! /bin/sh
改成#! /bin/bash
.不过,也是一样的。
使用 shell 脚本是否可以得到与单独输入命令相同的结果?
答案1
如果您明确指定sh command.sh
,sh
用于运行您的脚本,无论该#!
行如何。然而,正如链接的答案所说,sh
不理解&>
为自己的运算符并读取
nohup python print1.py &> 1.txt &
作为两个命令:
nohup python print1.py &
> 1.txt &
第一个导致 的输出print1.py
被写入nohup.out
,第二个创建一个空的1.txt
。
如果您不想bash
运行sh
您的command.sh
,您可以使用
bash command.sh
或者放入#!/bin/bash
文件#!/bin/sh
中,使其可执行,然后简单地运行
./command.sh
在其自己的。