簡體   English   中英

在C ++中執行shell命令時強制環境進行重擊

[英]Forcing the environment to bash when executing shell command in C++

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

您有兩種選擇:

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.

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

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

您可以通過以下方式運行它:

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

因此,如果僅構建一個包含以上內容的字符串,則可以使用popen()或其他任何方式運行它。 在C ++中,如果直接使用上述內容,則必須轉義內部引號,因此:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM