2013-01-25 44 views
1

我怎麼能說在bash shell腳本定義的函數從C程序

#!/bin/sh 

    func1() 
    { 
     echo "This is func1 from shell script" 
    } 

    func2() 
    { 
     echo "This is func2 from shell script" 

    } 

我想打電話給FUNC1和FUNC2從C程序。我可以這樣做嗎?

+1

除非你正在編寫一個可加載的內置,否。 – ormaaj

+0

@ormaaj你有多確定? – abc

+0

@ormaaj您能否詳細說明可裝入的內建函數? – abc

回答

8

這不可能是一個好主意,但我想你可以寫這樣的事情:

if (! fork()) { // TODO fork can return -1 on error; should check for that 
    execl("/bin/sh", "-c", ". FILE && func1", (char *)NULL); 
    // TODO should check to make sure execlp successfully replaced the process 
} 

其中FILE.sh文件,它定義func1的名稱。上面將生成一個子進程,並用參數-c(意思是「要運行的腳本是下一個參數」)和. FILE && func1(它是腳本;參數爲0)替換該進程的Bash實例(或任何你的shell)。這意味着「運行FILE中的命令,如果成功,則運行命令func1」)。

更多信息:

+0

這也起作用了:system(「source/home/abc/cpractice/test_functions; func1; func2」);該文件在哪裏?這裏使用的語法? – abc

+1

@abc:';'只是一種分離命令的方式。如果您願意,您可以使用'\ n'。 (這兩者在所有情況下都不完全相同,但在大多數情況下它們是等效的。) – ruakh

+1

請注意,如果腳本包含除函數聲明之外的任何內容(即,如果它與普通腳本類似),那麼將會執行以及。正如@ruakh所說,這不太可能是一個好主意。 –

2

比使用叉稍微簡單一些/ EXEC是STDLIB 「系統」 命令。

請參閱man 3 system

假設你的bash功能文件「/tmp/scripts.sh」 ......

system("bash -c \". /tmp/scripts.sh ; func1 ; func2\""); 
0

如果你想recive執行腳本的退出代碼,你應該使用系統,否則使用的vfork + exec *