NoI*_*ame 6 c++ linux bash shell sh
TL;博士; 我猜使用的外壳std::system是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());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,测试更容易了,而且我认为结果更好。
然后,我尝试ps再次测试该命令,但在自定义 shell 中,结果是:test_shell, ps。
又奇怪了。外壳怎么不是sh,也不是bash?而且,我所做的最终测试是:echo $0。sh而且,在自定义 shell 和正常程序中,结果都是。
编辑
似乎/bin/sh链接到/bin/bash(ll /bin/sh命令的输出是),实际上,和/bin/sh -> bash之间的唯一区别似乎是文件名,并且文件的内容是相同的。我也用命令检查了这些文件之间的差异:shbashdiff
$ xxd /bin/sh > sh
$ xxd /bin/bash > bash
$ diff sh bash
Run Code Online (Sandbox Code Playgroud)
(+是的,$SHELL并不意味着正在运行的shell(我在测试时不知道这一点,我只是想看看会发生什么))
GNU 来源(https://github.com/lattera/glibc/blob/master/sysdeps/posix/system.c)说
/bin/sh
Run Code Online (Sandbox Code Playgroud)
因此,硬链接到的都是Linux 上/bin/sh调用的 shell 。std::system()
(这是正确的,因为/bin/sh预计会链接到一个能够对系统执行操作的健全外壳。)