2012-05-28 63 views
3

我一直認爲當前目錄是用戶的東西,而不是腳本,因爲它取決於用戶的位置,每次腳本執行時都可能會有所不同。你應該改變shell腳本中的當前目錄嗎?

所以當我遇到Java jar實用程序-C選項時,我有點困惑。


對於那些誰也不知道-C選項指定一個文件/文件夾中的廣口瓶中,包括之前使用。由於該文件/文件夾的路徑在罐子被複制,在-C選項更改目錄包括前檔:

換句話說:

jar -C flower lily.class 

將包含一罐lily.class文件,而:

jar flower/lily.class 

會讓flower文件夾中包含lily.class

01罐子

對於我正在使用的Bourne通配符folder/*而言,由於它僅適用於下一個立即參數,因此無法使用-C

所以使用通配符的唯一方法是從當前目錄運行;但我仍然不願意改變和使用腳本中的當前目錄。

在腳本中使用當前目錄是否有任何缺點?也許是因爲某種原因而皺起了眉頭?

+2

我不明白爲什麼仇恨,因爲'cd'是子進程本地的。試試這個:'pwd; (cd ..; PWD); pwd',看到當你退出子shell(用圓括號表示)時,當前目錄返回到它開始的地方。無論腳本做什麼(除非你「源」而不是執行它),這對用戶無關緊要。 – Amadan

+2

沒關係,只要把它放回原來的位置即可。 –

+0

@Amadan我意識到這一點,但Gotos也工作,但他們皺起了眉頭。我想知道在腳本中是否有類似的改變目錄。 – Hawken

回答

1

我不認爲從shell腳本更改當前目錄有什麼內在的錯誤。當然,如果單獨採取,它不會造成任何不好的事情發生。

其實,我有我使用的用於啓動的基於Java的服務器標準的腳本,第一行是:

cd `dirname $0` 

這確保了命令的腳本其餘的都是在包含腳本文件本身的目錄中執行(在單臺機器託管多個服務器實例時很有用),而不管shell腳本實際從哪裏調用。在不更改腳本中的當前目錄的情況下,如果用戶在運行腳本之前記得手動將cd手動放入相應的目錄中,則只能正常工作。

在這種情況下,從腳本內部執行cd操作會從服務器啓動/關閉過程中刪除一個手動步驟,從而使事情的結果略微不太容易出錯。

因此,與大多數情況一樣,這類事情也有合法用途。我相信也有一些可疑的問題。這實際上取決於什麼最適合您的特定用例。這是我不能真正評論的東西...我總是讓maven爲我建立我的JAR。

+0

是的,'\'dirname $ 0''也是我用過的,我想知道我是否應該**。 – Hawken

+1

@霍金:請參閱[BashFAQ/028](http://mywiki.wooledge.org/BashFAQ/028)關於腳本的位置。 –

+1

@霍金 - _should_的問題真的取決於你。沒有什麼可以阻止你這樣做,儘管可能會出現一些可能出現的晦澀難懂的警告,按照丹尼斯的鏈接提出。你只需要決定你是否樂意接受這些警告。就我個人而言,他們並不打擾我,因爲我更願意擁有一個獨立的服務器部署,而不是一個防彈解決方案,如果有人在運行它時有人將mv的腳本從我的底下移出,那麼這個解決方案不會中斷。如果另一個系統管理員正在「圍繞」我的東西,那麼我就有更嚴重的問題擔心了。 – aroth