find、fzf、xargs を使用してファイルソースを取得することはできません。

find、fzf、xargs を使用してファイルソースを取得することはできません。

fzfを使用してさまざまな仮想環境を選択して有効にします。ただし、次のエラーが発生します。
xargs: source: No such file or directory

私のコマンドは3つの部分で構成されています。find | fzf | xargs
(1)マイ仮想環境を見つけるためのfind、
(2)仮想環境を選択するためのfzf、
(3)source選択したファイルのxargs。

完全なコマンドは次のとおりです。
find ~/.virtualenvs/ -maxdepth 1 -type d | fzf | xargs -I {} source {}/bin/activate
xargs: source: No such file or directory

ファイルを直接インポートできます(つまり、コマンドプロンプトにfzf_delete仮想環境に入ることが表示されます)。
brian:~$ source /home/brian/.virtualenvs/fzf_delete/bin/activate
(fzf_delete) brian:~$

fzf を使用して仮想環境を選択できます。
find ~/.virtualenvs/ -maxdepth 1 -type d | fzf
/home/brian/.virtualenvs/fzf_delete

また、findとfzfの依存関係を排除し、問題をxargsとして分離しました。
echo "/home/brian/.virtualenvs/fzf_delete" | xargs -I {} source {}/bin/activate
xargs: source: No such file or directory

私は変数、文字列連結、コマンド置換、bash -c、そして私が考えることができる方法を使ってさまざまな引用を試しましたが、役に立ちませんでした。

選択したファイルのソースを取得するためにxargsをどのように取得しますか?

PS - ファイル名にスペースが含まれている場合は、find、fzf、およびxargsでnull終了を使用する必要があることを知っていますが、これはすぐに問題が発生しないようです。

答え1

sourceシェル組み込みコマンドです。現在シェルを変更できないため、xargsrunは使用できません。xargsつまり、同様の操作を実行しても、次の... | xargs -I {} sh -c 'source {}/bin/activate'理由で役に立ちません。

  1. 現在のシェルはxargsを生成します。
  2. xargsは新しいシェルを作成します
  3. ファイルをインポートする新しいシェル
  4. 新しいシェル終了
  5. xargs 終了

環境を変更せずに始めた場所に戻りました。


一方、これは機能します:

source "$(find ~/.virtualenvs/ -maxdepth 1 -type d -print0 | fzf --read0)"/bin/activate

使用できないのとxargs同じ理由で、シェルスクリプトを介して上記のコマンドを実行できません。つまり、$HOME/bin/select-venvこのコマンドを使用して作成して実行可能にすると、サブシェルで生成されるため機能しません。

あなたできるただし、select_venv現在のシェルで関数またはエイリアスを作成します。

関連情報