主要问题是 shell 中的每一行都需要以 a 结尾\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'
~/.vimrc
如果你愿意,你可以在你的 vim 中关闭这种行为。请参阅:help 'eol'
vim 帮助。
另一个潜在的问题是,只有在 是非裸路径(即其中有一个)或者如果是在系统中时,它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))