Bash

移動文件並跟隨它們到目的地的別名

  • June 16, 2017

我正在嘗試編寫一個腳本——或者更準確地說是一個別名——它允許我移動文件並將它們跟隨 ( cd) 到它們的目標目錄。該問題的公認答案建議使用以下程式碼:

mvf() { mv "$@" && goto "$_"; }

wheregoto只是一個更安全的變體,cd並且$_是傳遞給最後一個命令的最後一個參數。

我的派生實現是這樣的:

alias mvaf="mv $@ && cd $_"

請注意,我沒有引用$@是為了不嘗試按所有參數的名稱移動文件。我最初確實嘗試過這個變體,但腳本也失敗了。如果我用 呼叫上述實現mvaf test1 test2 ..,它會拋出(翻譯):“mv: Missing file operand”

在調試時,我嘗試不使用cd, and Indeed alias 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"; }

連結mvcd命令&&在這裡很重要,因為&&確保只有在前一個命令成功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=

引用自:https://unix.stackexchange.com/questions/371383