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());
}
}
现在,测试更容易了,并且我认为结果更好。
然后,我再次尝试在自定义 shell 中测试 ps
命令,结果是:test_shell
,ps
。
这又很奇怪了。为什么 shell 不是 sh
或 bash
呢?最后我做的测试是: echo $0
。结果在自定义 shell 和正常程序中都是 sh
。
编辑
看起来 /bin/sh
链接到了 /bin/bash
(ll /bin/sh
命令的输出为 /bin/sh -> bash
),而实际上,sh
和 bash
之间唯一的区别就是文件名,文件内容相同。我还用 diff
命令检查了这些文件的差异:
$ xxd /bin/sh > sh
$ xxd /bin/bash > bash
$ diff sh bash
(+ 是的,$SHELL
并不表示当前正在运行的 shell(在测试时我并不知道这一点,我只是想看看会发生什么))
ps
找到其父进程,请在strace -f
下运行您的程序。 - Uselessll /bin/sh
命令,输出结果为/bin/sh -> bash
)。但它们似乎也有所不同。我不知道为什么。 - NoIdeaForUsername