2

我正在尝试将这一行包含在 python 脚本中。

!#/bin/bash/env python

import os

os.system("paste <(awk '!/^($|[:space:]*#)/{print $0}' file1) <(awk '!/^($|[:space:]*#)/{print $0} file2) > out_file")

直接从 bash 运行时,该命令非常好。但是,在脚本中,我得到:

sh: -c: line0: syntax error near unexpected token `('

简单使用时问题仍然存在:

os.system("paste <(cat file1) > output_file")

有任何想法吗?

4

2 回答 2

4

直接从 bash 运行时,该命令非常好。但是,在脚本中,我得到:

sh: -c: line0: syntax error near unexpected token `('

那是因为在脚本内部,您使用sh而不是运行命令bash。此命令和更简单的命令都使用bash- 特定功能。尝试运行一个shshell 并输入相同的行,你会得到同样的错误。

os.system调用没有记录它使用的 shell,因为它是:

通过调用标准 C 函数实现system()

在大多数类 Unix 系统上,这调用sh. 你可能不应该依赖它......但你绝对不应该依赖它调用bash

如果要运行bash命令,请使用subprocess模块并bash显式运行:

subprocess.call(['bash', '-c', 'paste <(cat file1) > output_file'])

我想,你可以尝试让引用权bash作为 shellsystem使用中的子 shell 运行……但为什么要麻烦呢?

这是文档反复告诉您应该考虑使用subprocess而不是os.system.

于 2013-04-15T11:10:53.577 回答
1

awk用一个脚本杀死两只鸟:

awk -v DELIM=' ' '!/^($|[[:space:]]*#)/{a[FNR]=a[FNR]DELIM$0}END{for(i=1;i<=FNR;i++)print substr(a[i],2)}' file1 file2

这消除了对过程替换的需要,因此是sh合规的。

于 2013-04-15T11:35:53.623 回答