2014-11-24 50 views
0

我想將bash代碼轉換爲C++代碼。我有這樣的事情:將bash(例如ssh)轉換爲C++使用std :: system

ssh ${USER}@${HOSTS[0]} "bash -c \"cd ${PROGRAM_PATH}; svn update; rm -rf build; make\"" 

我該如何將它轉換爲C++使用std :: system?我試過這個:

const std::string bashFunc("bash -c \"cd " + k_programPath + "; svn update; rm -rf build; make\""); 
const std::string func(getSSH(k_user, server) + " \"" + bashFunc + "\""); 
std::system(func.c_str()); 

當我打印func時,它看起來沒問題。但是當我運行它時,它不會與ssh連接,只會嘗試在本地文件夾上執行bash命令。

編輯:這是字符串的樣子:

SSH用戶名@服務器 「的bash -c」 CD ./path/to/folder; svn update; rm -rf build;使「」

+0

可能是個壞主意。 'svn'有一個庫,有OpenSSL等。 – 2014-11-24 23:10:08

+0

首先使用bash有什麼問題?你能打印你制定的實際字符串嗎? – 2014-11-24 23:16:27

+0

@Basile Starynkevitch:這只是我自己的一個小項目,沒什麼太複雜的。 – gartenriese 2014-11-24 23:17:01

回答

0

除了逃避引號,我也只好逃避斜線,這樣

const std::string bashFunc("bash -c \\\"cd " + k_programPath + "; svn update; rm -rf build; make\\\""); 

這工作了。

1

不要在任何使用system()但最簡單的情形 - 它增加了殼解析,每個增加了引號和轉義涉及您的代碼量額外的一層。如果你想讀的父進程

char * const command[] = {"bash", "-c", "yourcommand", NULL}; 
execv("/usr/bin/bash", command); 

一定要fork()達到此代碼之前,這樣你就不會隱退出你的腳本,並wait():相反,使用了execv()家人通話的成員其子女的退出狀態。

+0

感謝您的建議,我會試試這個。不用fork()我會使用std :: async。 – gartenriese 2014-11-25 01:10:03

+1

實際上你必須使用'fork()'。嘗試使用'std :: async()'內聯它會導致您的進程在您第一次使用exec * -series調用時終止。 – 2014-11-25 01:13:00

+0

很不幸! – gartenriese 2014-11-25 01:14:59