2010-12-16 77 views

回答

11

你不能。對當前目錄的更改僅影響當前進程。

2

Ignacio是正確的。然而,作爲一個十惡不赦的黑客(完全不明智的,這確實應該讓我至少下降10票),你可以exec的一個新的shell時,即可大功告成

 
#!/bin/bash 
... 
cd/
exec bash 
+1

您的downvotes要求你賺的給予好評 – 2010-12-16 15:29:27

+0

這將導致額外的shell中運行(您原來的最後一行)。獎勵積分,如果你也可以解決這個問題。 – Sorpigal 2010-12-16 15:34:12

+0

即使您現在必須鍵入退出兩次以關閉終端窗口,我仍然喜歡這一個。一個改進:exec bash -l(以便您的命令提示符合理) – 2013-05-08 17:56:49

5

讓我詳細說明這一點:

運行該腳本時,bash會爲其創建一個新進程,並且對當前目錄的更改只會影響該進程。

當您輸入腳本時,腳本直接由您正在運行的shell執行,而不會創建額外的進程,因此當前目錄的更改對主shell進程可見。

所以,伊格納西奧指出,這不能做

0

您可以定義在當前shell中運行,以支持該功能。例如。

md() { mkdir -p "$1" && cd "$1"; } 

我上面我的〜/ .bashrc

+1

這與問題有什麼關係? – mob 2010-12-16 17:28:12

+1

@mob它允許用戶定義一種快速切換到特定/可變目錄的方式,這可能是問題和後續搜索的目的。+1 – BroSlow 2015-09-27 08:05:21

1

如果你真的需要這種行爲,可以使你的腳本返回的目錄,然後用它在某種程度上。喜歡的東西:

#!/bin/bash 
cd /tmp 
echo $(pwd) 

,然後你可以

cd $(./script.sh) 

醜陋,但確實在這個簡單的例子的伎倆。

+0

我同意 - 如果用戶真的需要這個,並且不能通過.bashrc函數中的函數來實現,最接近的就是運行外部腳本,然後cd到任何返回的東西 - 這意味着外部腳本不能與用戶有任何交互,因爲你正在消耗所有的輸出。這就是爲什麼William的答案似乎更加靈活一些。 mayEb stderr可以被使用 - 真的需要用戶關於用例的更多細節 – nhed 2011-03-13 05:11:45

1

這是一個愚蠢的想法。使用PROMPT_COMMAND。例如:

 
$ export PROMPT_COMMAND='test -f $CDFILE && cd $(cat $CDFILE) && rm $CDFILE' 
$ export CDFILE=/tmp/cd.$$ 

然後,使你的腳本是「PWD> $ CDFILE」