背景信息:我在Mac上运行this snippet并注意到字符串-n
洒在乱码输出中。答案是,Ubuntu上的sh
了解-n
标志,而我的Mac上的sh
则不然。
正如您所看到的,python正在向stdout发送字符串"-n abc\n"
而不是预期的"abc"
。
os.system
来电是否无法将-n
和abc
分开?同时发生两个zsh(倒置的%
是zsh表示EOF的方式)和bash,但是如果我没有错,那么python-call不应该调用shell(不是因为我读过任何说明的东西,但是基于我的常识)(编辑:结果我完全错了,系统运行子shell)
了解红宝石的作用:
还有一些测试:
看起来脚本已发送到sh
,但此时shell的环境变量仍为zsh
。说得通。我没有采取任何措施来清理环境......也许sh
并没有自动设置$SHELL
。
答案 0 :(得分:2)
[
来实现os.system
]通过调用标准C函数系统()
跟进the man page for C's system
:
system()通过调用/ bin / sh -c命令执行命令中指定的命令,并在命令完成后返回。在执行命令期间,SIGCHLD将被阻止,SIGINT和SIGQUIT将被忽略。
重点是我的。
某些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.call
与shell=True
和executable='<shell>'
选项一起使用,而不是os.system
。
答案 2 :(得分:0)
python -c 'import subprocess; subprocess.call(["echo", "-n", "abc"])'