主な問題は、最後の行も含めて、シェルのすべての行\n
が実行されるためにで終わる必要があることです。文字列\n
の最後に追加するだけです。と友達はこの問題を抱えていないので、"echo 'hello'"
これは間違いなくのバグですが、使用したい場合は、それに対応する必要があります。csh
bash
csh
テキストファイルを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))