fzdwx

fzdwx

Hello , https://github.com/fzdwx

シェルスクリプトでcdを実行してから、メインシェルのパスが変更されます。

起因#

昨日の夜、fzf と cd を連携させたかったので、次のコマンドを作りました:

cd $(fd --type d | fzf)

このコマンドは確かにタスクを完了することができますが、問題が 2 つあります:

  1. 直接終了するとホームディレクトリに戻ってしまいます。なぜなら、$(..)の実行結果が空だからです。
  2. 毎回これだけ入力するのは面倒です。

alias を使用する#

それから alias を試してみました。.zshrcに次の行を追加しました:

alias cdf="cd $(fd --type d | fzf)"

結果は実行できませんでした。なぜなら、$(..)の部分が直接認識され、その部分だけが実行されるからです。

shell スクリプトを使用する#

次に、次のファイルを作成しました:

#!/bin/sh
path=$(fd --type d --strip-cwd-prefix --hidden --follow --exclude .git --exclude node_modules | fzf)

if [ -z "$path" ]; then
    exit
fi

cd "$path" || exit

結果はやはりうまくいきませんでした。最後にecho "$PWD"という行を追加しましたが、実行されましたが、プログラムが終了すると無効になりました。

解決策#

最終的に、source xxxまたは. xxxを使用して解決する方法を見つけました。最終的には alias+shell スクリプトでこの操作を完了しました:

alias cdf="source /path/to/cdf"

同時に、上記で述べた 2 つの問題も解決されました。

source はなぜ解決できるのか?#

直接シェルスクリプトを実行すると機能しないのは、それが現在のシェル環境ではなく、サブシェルで実行されるためです。そのため、結果を現在のファイルディレクトリに変更することはできません。

一方、sourceまたは.は、現在のシェル環境で実行されることを意味します。そのため、成功するのです。

更新#

2022/11/18#

今日、より簡単な解決策が見つかりました。シェルメソッドを作成するだけです:

function cd() {
    cd "$(fzf)"
}

これを.zshrcに追加し、コマンドラインでcdと入力するだけです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。