このコマンドを実行するためになぜ2回使用するのですか?

このコマンドを実行するためになぜ2回使用するのですか?

エイリアスを作成して動作し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)。

おすすめ記事