ディレクトリをCDに渡す

ディレクトリをCDに渡す

私が見た最新のディレクトリに対してファジー検索を実行し、時間を節約するための簡単な1行機能があります。

dirs | sed 'y/ /\n/' | fzf | xargs cd

2時間後に何が間違っているのかわかりません。)

次のエラーが発生し続けます。

/usr/bin/cd: line 4: cd: ~/Downloads/demo: No such file or directory

ディレクトリが存在しても、私が何をしても構いません。 CDには何の問題があり、なぜ動作しないのですか?

コメントありがとうございます。追加情報 関数の作成などの他のアプローチを試しました。

fdr() {
     local dir
     dir=`dirs | sed 'y/ /\n/' | fzf`
     cd $dir
}  

正しい値を使用してもdir上記のエラーが発生します。

私の最後の機能

助けてくれてありがとう。サブシェルが私の頭の中で動作しており、これが私の最終的な答えです。少しハッキングされていましたが、今ではありません。

fdr() {
  local dir
  myusernmae=`whoami`
  dir=`dirs | sed 'y/ /\n/' | sed "s/~/\/Users\/$myusernmae/g" | fzf +m`
  cd "$dir"
}

答え1

これには3つの問題があります。

  1. cd~/Downloads/demo正しいパスが/Users/snickers/Download/demo

    通常、cd ~/Downloads/demoコマンドラインに入力すると、シェルはコマンドを実行する前にチルダをホームディレクトリパスに展開しますcd。変数拡張の前にチルダ拡張が発生するため、ここではこれは発生しません(「拡張間の順序を理解する方法は?")。

    bashシェルを使用すると仮定すると、 を使用すると、フルパスをdirs -l出力してこの問題を回避できます。dirs

  2. cdシェル組み込みコマンドです。 macOSコンピュータでは外部コマンドとしても使用できるため、/usr/bin/cd他の多くのUnixユーザーのようにはcd使用しませんxargs。ただし、外部cdコマンドは現在シェルのディレクトリを変更できません。これは「CDはなぜプログラムではないのですか?「そして」「cd」はどこにありますか?」と同様の問題。シェル関数のバリエーションはシェルの組み込みcdコマンドを使用するため、この問題を回避します。

  3. 最後の問題は2番目の問題の変形であり、他の問題のため実際には機能しません。つまり、コマンドが呼び出しシェルの外部コマンドによってcd実行されたときに作業ディレクトリを変更することはできませxargsxargs。このコマンドは、パイプラインのステップとしてサブシェルで実行されます。子シェルでシェルを変更しても親シェルでは変更されません。

あなたは利用可能でなければなりません

fdr () {
   cd "$( dirs -l -p | fzf )"
}

この行の各行は、dirs -l -pチルダが拡張されたディレクトリスタックのディレクトリを出力します。bashこれは、名前に改行文字を含むディレクトリがスタックにないと仮定しますが、〜する空白のディレクトリがサポートされています(部分的には変換のために部分的にsed引用されていない拡張のため、独自の関数ではこれを行いません$dir)。

関連情報