エイリアスを作成して動作しalias goto="cd $@ && source ~/.zshrc"
ましたが、2回実行した場合にのみ可能です。あるシェルで 2 回実行しても別のディレクトリに移動するには、再度 2 回実行する必要があります。なぜそんなことですか?どのように変更できますか?
2回入力する必要がありますgoto <dir>
。最初はまだ正常な方向に行き、2番目は目的地に達しました。パスを確認したので、.zshrcのソースコードを取得する必要があります。
CURRENT=$PWD
AT_HOME=0
AT_ROOT=0
if [ $PWD = $HOME ]; then
AT_HOME=1
elif [ $PWD = / ]; then
AT_ROOT=1
else
cd ../
if [ $PWD = $HOME ]; then
AT_HOME=1
elif [ $PWD = / ]; then
AT_ROOT=1
else
cd ../
if [ $PWD = $HOME ]; then
AT_HOME=1
elif [ $PWD = / ]; then
AT_ROOT=1
fi
fi
fi
cd $CURRENT
if [ $AT_HOME = 0 ]; then
if [ $AT_ROOT = 0 ]; then
ZSH_THEME="prompt-basename"
else
ZSH_THEME="prompt-normal"
fi
else
ZSH_THEME="prompt-normal"
fi
これは私にフルパス(/usr/lib/jvm/java-13/binでも)を提供し、〜/.zshrcを取得すると私が望むパス(.../java-13/bin)を提供します。ところで、交換&&
も;
機能しません。
ありがとうございます!
*これはstackxchange.comに関する私の最初の質問なので、過度に厳しく言わないでください。
答え1
まず、エイリアスは関数ではなく、パラメータを受け入れません。代わりに、エイリアスは単純な置換です。goto foo
コマンドラインに入力してEnterキーを押すと、シェルはコマンドラインをgoto
実行する前にエイリアス値に置き換えます。
したがって、$@
エイリアスに渡された引数は拡張されません。実際、この場合は次のように拡張されます。現在受け取っているシェルまたはスクリプトに渡されたパラメータ。そのため、2番目はうまくgoto
いきます。これで、ファイルをインポートするとディレクトリがパラメータとして渡され、エイリアスを再宣言するとそのパラメータに展開されます。.zshrc
$@
"
また、二重引用符を"
使用しているので、$@
拡張別名を宣言するとすぐに。これが発生するかどうかを確認するには、シェルがエイリアスを表示し始めた直後にalias
引数なしで入力します。
goto
パラメータを処理するには、パラメータを関数として宣言する必要があります。goto() { cd $@ && ... }
しかし、一般的に言えば、⚠️あなたはする必要がありますいいえ source ~/.zshrc
。ドットファイルの内容によっては、さまざまな問題が発生する可能性があります。
逆に、ファイルを変更し.zshrc
てそれを適用するには、端末を再起動するか(現在のタブ/ウィンドウを閉じて新しいタブを開く)、シェルを再起動する必要があります(入力exec $SHELL
)。
答え2
マロンの答えは有効です。エイリアスを作成する代わりに、次の機能を実行しました。
function goto {
cd $@ && exec $SHELL
}
そしてそれは素晴らしい作品です。また、.zshrcが呼び出されるたびに〜/ .zshrcを取得するのに時間がかかりますgoto
。