Find

無法使用 find、fzf 和 xargs 獲取文件

  • June 16, 2022

我正在嘗試使用 fzf 來選擇和啟動不同的虛擬環境。但是,我收到以下錯誤:

xargs: source: No such file or directory

我的命令包括三個部分:find | fzf | xargs
(1) find 定位我的虛擬環境,
(2) 使用 fzf 選擇虛擬環境,
(3) xargs 用於source選擇的文件。

下面是完整的命令:

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 一起使用,但這似乎不會導致直接問題。

source是一個shell內置命令。您將無法使用 執行xargs,因為xargs無法更改您目前的 shell。也就是說,即使您要做類似的... | xargs -I {} sh -c 'source {}/bin/activate'事情也無濟於事,因為:

  1. 您目前的 shell 生成 xargs
  2. xargs 生成一個新的 shell
  3. 新的外殼源您的文件
  4. 新的 shell 退出
  5. xargs 退出

你回到了你開始的地方,沒有對你的環境進行任何修改。


另一方面,這將起作用:

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

請注意,出於同樣的原因,您不能使用xargs,您也不能通過 shell 腳本執行上述命令。也就是說,如果您$HOME/bin/select-venv使用該命令創建並使其可執行,它將無法工作,因為它將在子shell 中生成。

但是,您可以select_venv在目前 shell 中創建函式或別名。

引用自:https://unix.stackexchange.com/questions/706348