TL;博士; 我猜使用的外殼std::system是sh. 但是,我不確定。
我嘗試使用以下代碼列印外殼: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.
又奇怪了。怎么殼不是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
( 是$SHELL的,不代表正在運行的shell(我在測驗的時候不知道,我只是想看看會發生什么))
uj5u.com熱心網友回復:
GNU 源代碼(https://github.com/lattera/glibc/blob/master/sysdeps/posix/system.c)說
/bin/sh
因此,硬鏈接到的都是Linux 上/bin/sh呼叫的 shell 。std::system()
(這是正確的,因為/bin/sh預計會鏈接到能夠對系統進行操作的健全的外殼。)
uj5u.com熱心網友回復:
根據cppreference.com,std::system
呼叫宿主環境的命令處理器(例如
/bin/sh,cmd.exe,command.com)
這意味著使用的 shell 將取決于作業系統。
在任何 POSIX 作業系統(包括 Linux)上,使用的 shellstd::system是/bin/sh. (盡管正如 OP 指出的那樣,/bin/sh它可能是另一個 shell 的符號鏈接。)
至于SHELL環境變數,正如評論中已經指出的那樣,這個環境變數不能用來可靠地識別正在運行的shell程式。SHELL由 POSIX 定義為
表示用戶首選命令語言解釋器的路徑名
(來源)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/428408.html
