2016-05-23 185 views
0

我正在C++中創建一個應用程序,該應用程序可以執行一些命令shell來獲取有關係統的信息。當我在我的腳本代碼中使用類似[[ "$devname" == "bus/"* ]]&& continue;的命令時,執行此命令會返回錯誤,這可能是因爲在執行腳本腳本時,環境位於dash而不是bash。我試圖用#!/usr/bin/env bash執行該命令,但不起作用。完整的命令是內聯硬編碼的,我避免使用shell腳本文件。在C++中執行shell命令時強制執行環境bash

回答

1

如果您有這樣的命令,說:

[[ "$devname" == "bus/"* ]] && hostname || echo "no" 

您可以運行這樣說:

bash -c '[[ "$devname" == "bus/"* ]] && hostname || echo "no"' 

所以,如果你只是建立一個包含上述一個字符串,可以使用popen()或任何運行它。在C++中,你將不得不如果你使用上面的字面逃跑內報價,因此:

const char* command = "bash -c '[[ \"$devname\" == \"bus/\"* ]] && hostname || echo \"no\"'"; 
+0

我使用這個解決方案,因爲在我的解決方案中,我使用了popen,但只使用了十六進制格式的命令以避免使用de scape字符 – JulianOliveira

2

你有兩個選擇:

1)明確通過putenv()設置SHELL

putenv("SHELL=/bin/bash"); 
execl(...); 

2)明確執行/bin/bash,而不是依靠hashbang:

execl("/bin/bash", script.c_str(), NULL); 

// script is the script you're trying to execute. 
+0

我不認爲您的解決方案(1)應該工作。誰應該尊重'SHELL'變量? C++不一定會這樣做(標準中沒有任何內容會強加它),對於程序加載器也不是特別的。如果要加載的腳本沒有sheebang行,則會使用默認shell(通常是'sh')。 – user1934428