2017-10-07 143 views
0

如果我想輸入需要路徑的命令時,我的路徑中有空格,如何在C++中使用system()函數? 示例代碼:帶空格的C++系統()命令路徑

#include <iostream> 

int main() 
{ 
    std::string command = "ls -la /home/testuser/this is a folder/test/"; 
    std::cout << "Click enter to execute command..." << std::endl; 
    getchar(); 
    std::system(command.c_str()); 
    return 0; 
} 

因爲外殼中的空間的前需要退格這並不推測工作。 不幸的是,這並不工作過:

std::string command = "ls -la /home/testuser/this\b is\b a\b folder/test/"; 

任何想法,我做錯了或者我怎麼可能做的更好?謝謝。

+0

爲什麼使用「鍾」字符'\ b'?你需要反斜槓'「a \\ b」'或者把你的路徑放到一個單引號中。請注意,這兩種方法仍然容易受到流氓反斜槓或報價的影響,所以爲了逃避每一個不好的字符,您需要像Python – myaut

+0

的'pipes.quote'這樣的單個'\\'''''' – Raindrop7

+0

謝謝!有用。我只是誤解了\ b。它被寫爲「退格」,我沒有閱讀全文。愚蠢的我... https://www.daniweb.com/programming/software-development/threads/230885/what-is-the-purpose-of-using-r-and-b-in-c – Dominik

回答

1

問問自己:如何從shell提示符執行這個命令?

$ ls -la /home/testuser/this is a folder/test/ 

這當然不會出於您的程序失敗的相同原因。相反,如shell腳本每次底漆教你,你需要引用參數:

$ ls -la "/home/testuser/this is a folder/test/" 

,將工作,和你完全相同的方式使用system()

std::string command = "ls -la \"/home/testuser/this is a folder/test/\""; 

但是,什麼是更好的首先不使用system()。所有system()實際上都是fork(),其次是子進程中的exec(),父進程wait()用於子進程的終止。

問題是子進程exec()系統shell,它根據其規則解析命令。這包括直接通過shell執行命令時發生的所有常見事情:文件名擴展,通配符和其他事情。

如果傳遞給exec()的字符串包含任何特殊的shell字符,它們將被shell解釋。在這種情況下,您有意使用它來正確解析命令字符串,以便將正確的參數傳遞給/bin/ls

當執行特定的固定命令時,這很好。但是,當實際命令發生變化或包含外部指定的參數時,您有責任正確處理任何shell通配符以獲得預期的結果。否則,希拉里亞斯會繼續。在這種情況下,您會發現使用fork()exec()自己將產生更加確定性和可靠的結果,您可以完全控制傳遞給正在執行的命令的所有參數,而不依賴於系統shell來執行它適合你。