2011-05-24 247 views
2

我想在C中編寫一個命令行工具,它可以作爲可移植到Windows/Mac/Linux的高級「cd」或「pushd/popd」命令。 (詳細信息,如果您好奇,請致電http://alsweigart.tumblr.com/post/4008393181/command-line-idea-up以便攜方式以編程方式更改shell的cwd

問題是,當用戶從shell運行程序時,更改當前工作目錄將更改程序的cwd而不是shell的cwd。

有沒有辦法編寫一個程序來做我想做的事情,還是我不得不求助於編寫bash腳本/批處理文件?

或者,有沒有一種方法可以將程序的輸出作爲shell命令運行?即程序輸出「cd/foo/bar」,shell腳本調用該程序並將其輸出作爲shell命令運行。

回答

1

操作shell的工作目錄是必須由shell自己完成的 - 你不能編寫程序來完成它。至於你的第二個問題,請發表你的問題的例子。

3

通常,一個進程無法更改另一個進程的當前目錄(在Windows和Unix系統上都是如此)。因此,在shell外部作爲單獨進程運行的程序不能更改shell的當前目錄。

您可能必須使用批處理文件和/或shell腳本的某種組合才能完成您想要執行的操作。請注意,雖然Windows批處理文件可以更改它們運行的​​shell的當前目錄,但這是而不是在Unix上是shell腳本的真實情況。在Unix的情況下,您可能會想要使用shell 函數,它們在相同的進程中運行。請注意,編寫shell函數是特定於shell的,因此您必須將程序移植到您想要支持的每個Unix shell。

在某些Unix shell上,可以使用.命令使shell腳本在當前shell的上下文中運行。如果您的shell支持該功能,則可以使用shell別名來運行它,因此您不必在命令前鍵入.

+0

那麼在Unix上'cd'也必須一直是內置的shell? – Joey 2011-05-24 23:16:40

+1

這是正確的。將'cd'實現爲外部進程將使得不可能更改shell進程的當前目錄。 – 2011-05-24 23:18:02

0

解決的辦法是創建一個運行程序的shell函數,然後對結果執行cd操作。

mycd() 
{ 
    cd `mycdprogram "[email protected]"` 
} 

您可以運行它像mycd Please change my directory to /tmp或您的程序需要的任何參數。

對於其他命令,你可以這樣做:

myrun() 
{ 
    eval `myprogram "[email protected]"` 
} 

和外殼將盡一切shell命令myprogram產生。

當然這些都是POSIX shell的。

0
$(echo "cd /foo/bar") 

這演示瞭如何使用POSIX shell來做這樣的事情。當然,它不能與Windows外殼一起使用。