shell std::system 有什么用?
What shell does std::system use?
TL;DR; 我猜 std::system
使用的 shell 是 sh
。但是,我不确定。
我尝试打印 shell,使用此代码:std::system("echo $SHELL")
,输出为 /bin/bash
。这对我来说很奇怪。所以,我想看看,如果我在 sh
中这样做会发生什么?并且,相同的输出:/bin/bash
。此外,如果我使用 SHELL="/usr/bin/something"
之类的命令将 SHELL
变量设置为另一个字符串,它将打印我为其设置的新字符串 (/usr/bin/something
),它看起来是这不是查看 shell 它正在使用什么的好方法。然后,我尝试使用 ps
命令检查它,输出为:bash
、a.out
、ps
。在此列表中看到 bash
很奇怪。所以,我创建了一个自定义 shell,并将 gnome-terminal 中的 shell 更改为它:
#include <iostream>
int main()
{
std::string input;
while (true)
{
std::string command;
std::getline(std::cin, command);
std::system(command.c_str());
}
}
现在,测试更容易了,我认为,结果更好。
然后,我尝试再次测试ps
命令,但是在自定义shell中,结果是:test_shell
、ps
.
又奇怪了。为什么 shell 不是 sh
,也不是 bash
?而且,我做的最终测试是:echo [=33=]
。而且,在自定义 shell 和普通程序中,结果都是 sh
。
编辑
似乎 /bin/sh
链接到 /bin/bash
(ll /bin/sh
命令的输出是 /bin/sh -> bash
),实际上,这似乎是 [=15 之间的唯一区别=]和bash
是文件名,文件内容相同。我也用 diff
命令检查了这些文件之间的区别:
$ xxd /bin/sh > sh
$ xxd /bin/bash > bash
$ diff sh bash
(+ 是的,$SHELL
并不意味着 运行 shell (我在测试时不知道,我只是想看看会发生什么) )
根据cppreference.com,std::system
calls the host environment's command processor (e.g. /bin/sh
, cmd.exe
, command.com
)
这意味着使用的 shell 将取决于操作系统。
在任何POSIX OS(包括Linux)上,std::system
使用的shell是/bin/sh
。 (尽管正如 OP 指出的那样,/bin/sh
可能是另一个 shell 的符号链接。)
至于SHELL
环境变量,正如评论中指出的那样,该环境变量不能用于可靠地识别运行 shell程序。 SHELL
由POSIX定义为
represent a pathname of the user's preferred command language interpreter
(source)
GNU 来源 (https://github.com/lattera/glibc/blob/master/sysdeps/posix/system.c) 说
/bin/sh
因此,/bin/sh
硬链接到的 shell 是由 std::system()
在 Linux 上调用的 shell。
(这是正确的,因为 /bin/sh
应该链接到能够使用系统做事的正常 shell。)
TL;DR; 我猜 std::system
使用的 shell 是 sh
。但是,我不确定。
我尝试打印 shell,使用此代码:std::system("echo $SHELL")
,输出为 /bin/bash
。这对我来说很奇怪。所以,我想看看,如果我在 sh
中这样做会发生什么?并且,相同的输出:/bin/bash
。此外,如果我使用 SHELL="/usr/bin/something"
之类的命令将 SHELL
变量设置为另一个字符串,它将打印我为其设置的新字符串 (/usr/bin/something
),它看起来是这不是查看 shell 它正在使用什么的好方法。然后,我尝试使用 ps
命令检查它,输出为:bash
、a.out
、ps
。在此列表中看到 bash
很奇怪。所以,我创建了一个自定义 shell,并将 gnome-terminal 中的 shell 更改为它:
#include <iostream>
int main()
{
std::string input;
while (true)
{
std::string command;
std::getline(std::cin, command);
std::system(command.c_str());
}
}
现在,测试更容易了,我认为,结果更好。
然后,我尝试再次测试ps
命令,但是在自定义shell中,结果是:test_shell
、ps
.
又奇怪了。为什么 shell 不是 sh
,也不是 bash
?而且,我做的最终测试是:echo [=33=]
。而且,在自定义 shell 和普通程序中,结果都是 sh
。
编辑
似乎 /bin/sh
链接到 /bin/bash
(ll /bin/sh
命令的输出是 /bin/sh -> bash
),实际上,这似乎是 [=15 之间的唯一区别=]和bash
是文件名,文件内容相同。我也用 diff
命令检查了这些文件之间的区别:
$ xxd /bin/sh > sh
$ xxd /bin/bash > bash
$ diff sh bash
(+ 是的,$SHELL
并不意味着 运行 shell (我在测试时不知道,我只是想看看会发生什么) )
根据cppreference.com,std::system
calls the host environment's command processor (e.g.
/bin/sh
,cmd.exe
,command.com
)
这意味着使用的 shell 将取决于操作系统。
在任何POSIX OS(包括Linux)上,std::system
使用的shell是/bin/sh
。 (尽管正如 OP 指出的那样,/bin/sh
可能是另一个 shell 的符号链接。)
至于SHELL
环境变量,正如评论中指出的那样,该环境变量不能用于可靠地识别运行 shell程序。 SHELL
由POSIX定义为
represent a pathname of the user's preferred command language interpreter
(source)
GNU 来源 (https://github.com/lattera/glibc/blob/master/sysdeps/posix/system.c) 说
/bin/sh
因此,/bin/sh
硬链接到的 shell 是由 std::system()
在 Linux 上调用的 shell。
(这是正确的,因为 /bin/sh
应该链接到能够使用系统做事的正常 shell。)