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 命令检查它,输出为:basha.outps。在此列表中看到 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_shellps.

又奇怪了。为什么 shell 不是 sh,也不是 bash?而且,我做的最终测试是:echo [=33=]。而且,在自定义 shell 和普通程序中,结果都是 sh

编辑

似乎 /bin/sh 链接到 /bin/bashll /bin/sh 命令的输出是 /bin/sh -> bash),实际上,这似乎是 [=15 之间的唯一区别=]和bash是文件名,文件内容相同。我也用 diff 命令检查了这些文件之间的区别:

$ xxd /bin/sh > sh
$ xxd /bin/bash > bash
$ diff sh bash

(+ 是的,$SHELL 并不意味着 运行 shell (我在测试时不知道,我只是想看看会发生什么) )

根据cppreference.comstd::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。)