1

我正在尝试从 python 构造和执行一个 csh 脚本。

我生成的代码看起来像一个正确的脚本,并返回“0”,但除非我使用 vim 手动进入并重新保存,否则os.system("my_script.csh")脚本不会在其中执行任务(手动更改脚本中的任何内容 -我什至没有进入“插入”模式)。在我的代码中没有在 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

主要问题是 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))
于 2013-01-21T23:01:37.177 回答
0

您应该结帐子流程,它显示了许多示例。

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

因为您想捕获命令的输出而不仅仅是返回状态。

于 2013-01-21T19:18:50.957 回答