OSX上的python和echo -n

时间:2013-02-14 04:29:11

标签: python ruby bash unix zsh

背景信息:我在Mac上运行this snippet并注意到字符串-n洒在乱码输出中。答案是,Ubuntu上的sh了解-n标志,而我的Mac上的sh则不然。

enter image description here

正如您所看到的,python正在向stdout发送字符串"-n abc\n"而不是预期的"abc"

os.system来电是否无法将-nabc分开?同时发生两个zsh(倒置的%是zsh表示EOF的方式)和bash,但是如果我没有错,那么python-call不应该调用shell(不是因为我读过任何说明的东西,但是基于我的常识)(编辑:结果我完全错了,系统运行子shell)

了解红宝石的作用:

enter image description here

还有一些测试:

enter image description here 看起来脚本已发送到sh,但此时shell的环境变量仍为zsh。说得通。我没有采取任何措施来清理环境......也许sh并没有自动设置$SHELL

3 个答案:

答案 0 :(得分:2)

The Python docs州:

  

[os.system]通过调用标准C函数系统()

来实现

跟进the man page for C's system

  

system()通过调用/ bin / sh -c命令执行命令中指定的命令,并在命令完成后返回。在执行命令期间,SIGCHLD将被阻止,SIGINT和SIGQUIT将被忽略。

重点是我的。

The man page for echo解释道:

  

某些shell可能提供与此类似或相同的内置echo命令        效用。最值得注意的是,sh(1)中的内置回声不接受-n选项。        请参阅builtin(1)手册页。

你可以自己确认一下:

$ sh -c "echo -n hello"
-n hello
$ bash -c "echo -n hello"
hello

答案 1 :(得分:0)

the documentation所述,os.system在子shell中执行命令。根据您的系统,它可能会使用echo命令无法理解-n的shell。

如果您想确保它使用您选择的shell,请将subprocess.callshell=Trueexecutable='<shell>'选项一起使用,而不是os.system

答案 2 :(得分:0)

这是怎么回事?
python -c 'import subprocess; subprocess.call(["echo", "-n", "abc"])'
在osx上测试并正常工作