
我只想寫一個腳本改變我的目錄。
我將以下命令放入文件中/home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
我做到了
chmod +x pathABC
在終端機中,在 中/home/alex
,我運行了./pathABC
,但輸出只是HelloWorld
並且當前目錄沒有更改。
那麼有什麼問題嗎?
答案1
正如其他人所解釋的,目錄是在腳本的子進程中更改的,而不是在調用腳本的終端進程中更改的。子進程終止後,您將回到原來的終端。
幾種替代方案:
1.符號連結
在您的主頁中放置一個符號連結到您想要輕鬆訪問的長路徑
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
然後使用以下命令存取該目錄:
$ cd ~/pathABC
2. 別名
在 ~/.bashrc 中加入別名:
alias pathABC="cd /home/alex/Documents/A/B/C"
(從這裡)
3. 功能
建立一個更改目錄的函數,該函數在您的終端進程中運行,然後可以更改其目錄。
(從這裡)
4.避免小時候跑步
取得腳本而不是運行它。取得(由.
或完成source
)會導致腳本在同一 shell 中執行,而不是在其自己的子 shell 中執行。
$ . ./pathABC
5. 可 CD 的變數
cdable_vars
在您的~/.bashrc
目錄中設定選項並建立一個環境變數:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
然後你可以使用cd pathABC
(從這裡)
答案2
當您在終端機中執行腳本時,會執行一個子進程。在這個子程式中,即您的腳本將更改為指定的任何目錄。但在父進程中,即執行腳本的位置仍然位於舊路徑中。或簡單地說:
cd 指令的作用域僅適用於子進程,不適用於父進程。
答案3
你犯了一個思考錯誤。雖然目前殼保留在同一目錄中,腳本已移至新目錄。
您可以透過在中建立另一個腳本來看到這一點新的目錄,並在更改目錄後從腳本運行它:
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
第二個腳本將從新目錄運行。
HelloWorld
只是腳本的輸出。
答案4
$SHELL
最後使用
bash 腳本在其目前環境或其子環境中執行,但絕不會在其父環境中執行。
然而,這個問題經常被問到,因為人們想要執行後留在某個目錄的命令提示字元處來自另一個目錄的腳本。
如果是這種情況,只需執行子$SHELL
實例在腳本的末尾:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
若要返回上一個父級 shell 實例,請使用Ctrl+ D。