1

Pythonからcshスクリプトを作成して実行しようとしています。

私が持っているコードは正しいスクリプトのように見え、os.system("my_script.csh")「0」を返しますが、vimを使用して手動で入力し、再保存しない限り、スクリプトはその中のタスクを実行しません(スクリプト内で手動で何も変更しないでください- 「挿入」モードにも入りません)。私のコードでは、vimでの再保存が行われていないのは何ですか?それは可能ですか?

これが私のコードの関連部分です:

grabmeName = '%sgrabme%s.csh'%(dirNames['grabmes'],uniqID)
if not os.path.exists(grabmeName):
    open(grabmeName,'w').close()
    os.chmod(grabmeName,0777)
    with open(grabmeName,'a') as f:
        f.write("#!/bin/csh -f\n")
        f.write("echo 'hello'")
    os.system(grabmeName)
4

2 に答える 2

2

主な問題は、最後の行も含めて、シェルのすべての行\nが実行されるためにで終わる必要があることです。文字列\nの最後に追加するだけです。と友達はこの問題を抱えていないので、"echo 'hello'"これは間違いなくのバグですが、使用したい場合は、それに対応する必要があります。cshbashcsh

テキストファイルをvimに保存すると、最初に改行がなかった場合は、ファイルに末尾の改行が追加されます。事前にファイルのコピーを保存し、実行diffしてvimの変更を確認することで、これを確認できます。

$ cat blah-grabme-12.csh 
#!/bin/csh -f
echo 'hello'$ cp blah-grabme-12.csh blah-grabme-12.csh.orig
$ vim blah-grabme-12.csh
┌────────────────────────────────────────────────────────────────────────────────┐
│#!/bin/csh -f                                                                   │
│echo 'hello'                                                                    │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│~                                                                               │
│:wq❚                                                                            │
└────────────────────────────────────────────────────────────────────────────────┘
$ diff -u blah-grabme-12.csh.orig blah-grabme-12.csh.orig
--- blah-grabme-12.csh.orig
+++ blah-grabme-12.csh
@@ -1,2 +1,2 @@
 #!/bin/csh -f
-echo 'hello'
\ No newline at end of file
+echo 'hello'

必要に応じて、このvimの動作をオフにすることができます~/.vimrc:help 'eol'vimヘルプを参照してください。

もう1つの潜在的な問題は、が非ベアパスである場合、つまり、が含まれている場合、またはがシステム内にある場合system(filename)にのみ機能することです。filename/.$PATH

さらに、os.open()の代わりにを使用するとopen()、ファイルの作成時にファイルのアクセス許可を設定できます。ここでは大きな違いはないかもしれませんが、多くの場合、ファイルを作成してからそのアクセス許可を変更すると、セキュリティの脆弱性が発生します。このstackoverflowの質問は、その方法を示しています。


すべてをまとめると、次のようになります。

import os
import os.path

grabmeName = 'blah-grabme-12.csh'

with os.fdopen(os.open(grabmeName, os.O_WRONLY | os.O_CREAT, 0700), 'w') as f:
    f.write("#!/bin/csh -f\n")
    f.write("echo 'hello'\n")
os.system(os.path.abspath(grabmeName))
于 2013-01-21T23:01:37.177 に答える
0

多くの例が示されているサブプロセスをチェックアウトする必要があります。

output=`mycmd myarg`
# becomes
output = check_output(["mycmd", "myarg"])

リターンステータスだけでなく、コマンドからの出力をキャプチャしたい場合。

于 2013-01-21T19:18:50.957 に答える