我猜std::system使用的shell 是sh.但是,我不确定.

我试图打印shell,使用以下代码:std::system("echo $SHELL"),输出为/bin/bash.这对我来说很奇怪.所以,我想看看,如果我在sh年这样做会发生什么?同样的输出:/bin/bash.此外,如果我使用SHELL="/usr/bin/something"这样的命令,将SHELL变量设置为另一个字符串,它将打印我设置为它的新字符串(/usr/bin/something),看起来这不是查看它使用的shell的好方法.然后,我try 使用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());
    }
}

现在,它更容易测试,我认为,结果更好.

然后,我再次try 测试ps命令,但在自定义shell中,结果是:test_shellps.

又很奇怪了.shell 怎么不是sh,也不是bash?我做的最后一个测试是:echo $0.在定制shell和普通程序中,结果都是sh.

Edit

似乎/bin/sh/bin/bash相关联(ll /bin/sh命令的输出是/bin/sh -> bash),实际上,shbash之间的唯一区别似乎是文件名,文件的内容是相同的.我也用diff命令判断了这些文件之间的差异:

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

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

推荐答案

GNU的消息来源(https://github.com/lattera/glibc/blob/master/sysdeps/posix/system.c)说

/bin/sh

因此,无论/bin/sh与什么是硬链接的,都是Linux上std::system()调用的shell.

(这是正确的,因为/bin/sh预计将连接到一个能够使用该系统进行操作的理智shell .)

Linux相关问答推荐

GNC C:关于主要出发点混乱的 idea ?

Bash:将多行转换为单行的命令

Linux 中大型 TSV 的条件编辑

从 ALSA USB 硬件设备获取 USB 设备文件路径

如何在Linux下使用正则表达式更改文件名

如何在脚本中使用sudo修改其他用户的crontab

使用awk命令将以:分隔的两个文件合并的方法

如何在 ERE 中结束这个正则表达式

命令应在终端关闭后继续运行

在 Ansible 中使用 JSON 查询过滤数据以从 ansible_fact 中提取数据

如何在ubuntu中通过.sh文件启动多个服务

有什么方法可以知道在发送之前将在 TCP 上发送多少字节?

nohup 是否可以跨管道工作?

安装 mod_ssl 亚马逊 Linux

未定义的引用 'shm_open',已在此处添加 -lrt 标志

使用inotify的正确方法是什么?

谁决定任何数据类型或 struct 的大小(取决于 32 位或 64 位)?

如何自动化 HTML 到 PDF 的转换?

区分 Java 线程和 OS 线程?

Linux 上的 NuGet:获取响应流时出错