移動文件並跟隨它們到目的地的別名
我正在嘗試編寫一個腳本——或者更準確地說是一個別名——它允許我移動文件並將它們跟隨 (
cd
) 到它們的目標目錄。該問題的公認答案建議使用以下程式碼:mvf() { mv "$@" && goto "$_"; }
where
goto
只是一個更安全的變體,cd
並且$_
是傳遞給最後一個命令的最後一個參數。我的派生實現是這樣的:
alias mvaf="mv $@ && cd $_"
請注意,我沒有引用
$@
是為了不嘗試按所有參數的名稱移動文件。我最初確實嘗試過這個變體,但腳本也失敗了。如果我用 呼叫上述實現mvaf test1 test2 ..
,它會拋出(翻譯):“mv: Missing file operand”在調試時,我嘗試不使用
cd
, and Indeedalias mvaf="mv $@ "
,它基本上只是重命名mv
,移動文件。我現在想知道為什麼
mv
在我的第一個實現中缺少操作數,以及這可能是如何由&&
.
Alias 不支持類似的操作數 $ @, or $ 1、2美元等
你的命令
alias mvaf="mv $@ && cd $_"
等於
mv ' ' && cd $_
因為$@
別名無法以您期望的方式辨識。這可以很容易地證明如下:
$ alias mvaf='echo "Part 1:" $@ && echo "Part 2: " $_' $ mvaf file66 /tmp/ Part 1: Part 2: Part 1: file66 /tmp/ #Part 2 includes the previous executed command (echo "Part 1:" $@) & the text sent after alias name $ alias mvaf='echo "Part 1:" $@;echo "Part 2: "' $ mvaf file66 /tmp/ Part 1: Part 2: file66 /tmp/
另一方面,這可行,但不是因為 $@
$ alias mvaf='echo "mv $@"' $ mvaf file66 /tmp/ mv file66 /tmp/ $ alias mvaf='echo "mv"' $ mvaf file66 /tmp/ mv file66 /tmp/
總的來說,別名是一種簡單的替換。
Alias
aa='command1;command2'
,當被呼叫時aa sometext
等於command1;command2 sometext
為了使它工作,你需要用一個函式來做。Bash 不鼓勵使用別名,並鼓勵在此類工作中使用函式。您可以將此函式粘貼到您的 bash 配置文件中,並且可以像使用任何別名一樣直接從終端按名稱呼叫此函式:
mvcd() { mv "$1" "$2" && cd "$2"; }
連結
mv
和cd
命令&&
在這裡很重要,因為&&
確保只有在前一個命令成功cd
時才會執行第二個命令。mv
或者,正如在您的問題中接受的答案的連結中已經建議的那樣,您可以執行類似的操作
mvf() { mv "$@" && goto "$_"; } goto() { [ -d "$1" ] && cd "$1" || cd "$(dirname "$1")"; }
小心 bash 分詞。要使此類函式正常工作,如果要移動的文件或要發送的文件的目錄在其名稱中包含空格,則需要在呼叫該函式時插入雙引號。
$ mvcd() { echo "1=$1";echo "2=$2";echo "3=$3";echo "4=$4"; } $ mvcd spaced file1 /spaced directory/ 1=spaced 2=file1 3=/spaced 4=directory/ $ mvcd "spaced file1" "/spaced directory/" 1=spaced file1 2=/spaced directory/ 3= 4=