2

上下文:我在我的 Mac 上运行了这个片段,并注意到字符串-n散布在乱码输出中。答案是sh在 Ubuntu 上理解-n标志,而sh在我的 Mac 上则不理解。

在此处输入图像描述

如您所见,python 将字符串发送到标准输出,"-n abc\n"而不是预期的"abc".

通话是否os.system无法分离-nabc?zsh(倒数%是 zsh 表示 EOF 的方式)和 bash 都会发生,但如果我没记错的话,python 调用不应该调用任何 shell(不是因为我读过任何这样说的东西,而是基于我的常识)(编辑:原来我完全错了,系统运行一个子shell)

看看 ruby​​ 是如何做的:

在此处输入图像描述

还有一些测试:

在此处输入图像描述 看起来脚本已发送到,sh但此时 shell 的环境变量仍然是zsh. 说得通。我没有做任何清理环境的事情......也许sh没有自动设置$SHELL

4

3 回答 3

2

Python 文档状态:

[ os.system] 通过调用标准 C 函数 system() 来实现

按照C 的手册页进行system操作:

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

重点是我的。

echo 的手册页对此进行了解释:

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

您可以自己确认这一点:

$ sh -c "echo -n hello"
-n hello
$ bash -c "echo -n hello"
hello
于 2013-02-14T04:33:13.077 回答
0

文档中所述os.system在子 shell 中执行命令。根据您的系统,它可能使用echo不理解的 shell whos 命令-n

如果您想确保它使用您选择的 shell,请使用subprocess.callandshell=True选项executable='<shell>'而不是os.system.

于 2013-02-14T04:38:14.997 回答
0

那这个呢?
python -c 'import subprocess; subprocess.call(["echo", "-n", "abc"])'
在osx上测试并正常工作

于 2013-02-14T04:42:11.353 回答