我试图在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")
有什么想法吗?
答案 0 :(得分:4)
直接从bash运行时,该命令非常正常。但是,在脚本中,我得到:
sh: -c: line0: syntax error near unexpected token `('
这是因为在脚本中,您使用sh
而不是bash
运行命令。此命令和更简单的命令都使用bash
特定功能。尝试运行sh
shell并输入相同的行,您将收到相同的错误。
os.system调用不会记录它使用的shell,因为它是:
通过调用标准C函数
来实现system()
在大多数类Unix系统上,这会调用sh
。你可能不应该依赖它...但你肯定不应该依赖它来调用bash
!
如果要运行bash
命令,请使用subprocess
模块,然后明确运行bash
:
subprocess.call(['bash', '-c', 'paste <(cat file1) > output_file'])
我想,你可以试着让引用权运行bash
作为shell system
中使用的子shell ...但为什么要这么麻烦?
这是文档反复告诉您应该考虑使用subprocess
而不是os.system
的众多原因之一。
答案 1 :(得分: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
。