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固有の機能を使用します。シェルを実行しshて同じ行を入力してみてください。同じエラーが発生します。

os.system呼び出しは、使用するシェルを文書化していません。

標準 C 関数を呼び出して実装system()

ほとんどの Unix ライクなシステムでは、これはsh. あなたはおそらくそれに頼るべきではありません…しかし、あなたは間違いなくそれが呼び出すことに頼るべきではありませんbash!

bashコマンドを実行する場合は、subprocessモジュールを使用してbash明示的に実行します。

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

bashおそらく、シェルが使用するサブシェルとして実行する引用権を取得しようとすることもできsystemますが、なぜわざわざするのでしょうか?

subprocessこれは、 の代わりに の使用を検討する必要があるとドキュメントで繰り返し説明されている多くの理由の 1 つですos.system

于 2013-04-15T11:10:53.577 に答える
1

awk1 つのスクリプトで 2 羽の鳥を殺す:

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 に答える