cd
ファイルを移動してターゲットディレクトリに従うことができるスクリプト(より正確にはエイリアス)を作成しようとしています。これ受け入れられた回答この問題には、次のコードを使用することをお勧めします。
mvf() { mv "$@" && goto "$_"; }
ここではgoto
and のより安全なバリアントで、最後のコマンドに渡された最後の引数です。cd
$_
私の派生実装は次のとおりです。
alias mvaf="mv $@ && cd $_"
$@
すべてのパラメータを使用して名前でファイルを移動するのを防ぐために、引用符はありません。最初にこれを変えようとしましたが、スクリプトも失敗しました。上記の実装を呼び出すと、mvaf test1 test2 ..
「mv:欠落ファイルオペランド」が発生します(翻訳済み)。
デバッグ時に使用しようとしませんでしたが、cd
実際にはalias mvaf="mv $@ "
デフォルトで名前が変更され、ファイルがmv
移動されました。
これでmv
、最初の実装でオペランドが欠落している理由とこれが&&
。
ベストアンサー1
エイリアスは、$@、$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"; }
ここでは、前のコマンドが成功した場合にのみ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=