
我有一個.bash_profile
,其中我有一組別名。目前這些別名只會執行一個指令,而且相當簡單。然而,我想用我試圖創建的新別名來做兩件事。
- CD 進入目錄
- 從該目錄運行命令
答案1
要使用特定工作目錄執行命令,通常會這樣做
( cd directory && utility )
兩邊的括號cd ...
表示其中的指令在子 shell 中執行。更改子 shell 中的工作目錄使得呼叫 shell 的目前工作目錄不會更改,即呼叫此命令後,您仍然位於啟動時的相同目錄中。
例子:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
這不能變成通用別名,因為別名不能接受任何參數。
為一個具體的目錄和實用程序,可以做
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
但對於一般情況,您必須使用 shell 函數:
cdrun () {
( cd "$1" && shift && command "$@" )
}
或者
cdrun () (
cd "$1" && shift && command "$@"
)
將函數體周圍的大括號替換為圓括號,使函數在其自己的子 shell 中執行。
這將用作
$ cdrun "$HOME/somedir" ./script.sh
script.sh
這將運行位於目錄 中的腳本$HOME/somedir
,$HOME/somedir
作為工作目錄,或者
$ cdrun / ls -l
這將為您提供根目錄的“長格式”目錄列表。
shell 函數採用其第一個參數並嘗試變更到該目錄。如果有效,它將目錄名稱從位置參數(命令列參數列表)移開,並執行其餘參數給出的命令。command
是 shell 中的內建指令,它只是將其參數作為命令執行。
如果您想執行命令,則需要所有這些工作目錄已更改。如果您只想執行位於其他地方的命令,顯然可以使用
alias thing='$HOME/somedir/script.sh'
但這將運行script.sh
在$HOME/somedir
目前的目錄作為工作目錄。
在不更改工作目錄的情況下執行位於其他位置的腳本的另一種方法是將腳本的位置添加到PATH
環境變數中,例如
PATH="$PATH:$HOME/somedir"
現在只需使用script.sh
即可$HOME/somedir
從任何地方運行
$ script.sh
再說一次,這確實不是更改指令的工作目錄。
答案2
alias <name-of-the-alias>='cd <the-directory> && <command>'
因此,如果您想將目錄(cd)更改為該資料夾/var/log/
,然後列出(ls)其文件,您可以在.bash_profile
文件中附加以下內容:
alias logs='cd /var/log/ && ls'
答案3
我使用此函數在不同的目錄中運行單一命令:
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
此函數的一個限制是通配符是相對於原始目錄完成的,而不是相對於命令運行的目錄完成的。zsh 可以做得更好。
如果使用單一參數調用,則函數的行為與普通函數類似cd
,因此您可能需要調用它cd
。 (該函數不支援任何選項,但cd
很少使用選項。)
答案4
用分號分隔指令,例如:
alias do_something='cd /tmp; ls'