在Python中创建和执行tcsh脚本

时间:2013-01-21 19:11:48

标签: python shell scripting vi csh

我正在尝试从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)

2 个答案:

答案 0 :(得分:2)

主要问题是shell中的每一行都需要以\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的这种行为。请参阅vim帮助中的:help 'eol'

另一个潜在的问题是system(filename)仅在filename是非裸路径时才有效 - 即,其中有/ - 或者.是否在系统$PATH

此外,通过使用os.open()代替open(),您可以在文件创建时设置文件权限。在这里它可能没有太大的区别,但在许多情况下,创建文件然后更改其权限会产生security vulnerabilityThis stackoverflow question显示了如何做到这一点。


总而言之,你会得到这样的东西:

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))

答案 1 :(得分:0)

你应该结帐subprocess它会显示很多例子。

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

您希望捕获命令的输出而不仅仅是返回状态。