起因#
昨日の夜、fzf と cd を連携させたかったので、次のコマンドを作りました:
cd $(fd --type d | fzf)
このコマンドは確かにタスクを完了することができますが、問題が 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
と入力するだけです。