2017-06-15 96 views
4

我創建了一個名爲「myscript.h」的簡單bash腳本,我給它一個.h擴展名,原因是我不會在這裏透露。這個bash腳本位於「/ var/ftp /帶空格的東西」中。如何在文件路徑中有空格時使用「system()」執行bash腳本?

從終端,我可以輸入「/ var/ftp/something with spaces/myscript.h」,該腳本完美地工作。

不過,從我的C程序中,我在

system("/var/ftp/something with spaces/myscript.h") 

類型,並且抱怨說, 「在/ var/FTP /東西」 是找不到的。我已經改變了我的系統調用與向前以下斜槓:

system("/var/ftp/something\ with\ spaces/myscript.h") 

但是,它仍然抱怨說,「在/ var/FTP /東西」是找不到的。假設我無法更改目錄名稱,我該如何解決這個問題?

謝謝!

+0

請看看[編輯的幫助(HTTP:// stackoverflow.com/editing-help)。 – Cyrus

+1

嘗試在字符串中使用轉義序列\「:」 system(「\」/ var/ftp/something with spaces/myscript.h \「」); – ScottK

+2

使用'.h來調用您的bash腳本很有趣'extension ... –

回答

7

要運行一個腳本,你可能會避免system(3)庫函數(並使用較低級別的系統調用像fork(2)execve(2)waitpid(2) ......這由system(3)執行時使用),或者當您將它傳遞到system(3)時,您可以使用報價

欲瞭解更多詳情,請閱讀Advanced Linux Programming

在Linux上,system(3)被記錄爲分支/bin/sh -c進程。見sh(1p)。那個POSIX shell有一些quoting rules。您可以適當地使用雙引號和反斜槓。所以你會構造(也許檢查)傳遞到system(3)(也許使用asprintf(3)snprintf(3)護理)的字符串。請注意,C編譯器對string literals也有不同的引用約定。

在一般情況下,你應該避免code injection(想象一下一個調皮的用戶給予一定a; rm -rf $HOME &;輸入作爲一個「目錄」的名字;你不想對怪異
"/var/ftp/a; rm -rf $HOME &;/myscript.h"串運行system(3)

在你特別情況下,我推薦使用fork(2),execve(2)(也許通過一些仔細選擇exec(3)功能),waitpid(2) ...適當。這具有輕微的優勢,以避免取決於和運行/bin/sh,因此可能會稍快(一毫秒)。

瞭解更多作用Unix shell;例如,閱讀bash中的各種shell expansions(它們類似於POSIX sh所要求的那些)並且知道globbing。見glob(7)

0

請注意,您在從shell運行時添加引號。你需要在這裏做同樣的事情。報價添加到您向system路徑名:

system("\"/var/ftp/something with spaces/myscript.h\"") 
+0

我不瞭解Linux,但那個技巧在windows上不起作用。 –

+0

它可以在Linux上工作,但某些字符(反斜槓,換行符,雙引號......)可能需要轉義 –

-1

只要把文件名單引號內

system("rm '/var/ftp/something with spaces/myscript.h'") 
+1

如果文件路徑包含引號,則不那麼簡單。而'rm'在'system'內沒有用處,請使用[unlink(2)](http://man7.org/linux/man-pages/man2/unlink.2.html) –

+0

@thatotherguy:否,'unlink ''/ bin/rm'使用的系統調用(用於文件) –

+0

哦,我明白你的意思了。是的,'system(「rm foo」)'是一個壞主意,應該用'unlink(「foo」)替換' –

0

這應該用gcc版本5.4.0工作

system("\'\'/var/ftp/something\\ with\\ spaces/myscript.h\'\'"); 
相關問題