无法使用 find、fzf 和 xargs 获取文件源

无法使用 find、fzf 和 xargs 获取文件源

我正在尝试使用 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 - 我知道如果文件名包含空格,则应将 null 终止与 find、fzf 和 xargs 一起使用,但这似乎不会导致立即出现问题。

答案1

source是 shell 内置命令。您将无法使用 运行xargs,因为xargs无法更改当前的 shell。也就是说,即使你做了类似的事情也... | xargs -I {} sh -c 'source {}/bin/activate'无济于事,因为:

  1. 您当前的 shell 会生成 xargs
  2. xargs 生成一个新的 shell
  3. 新的 shell 获取您的文件
  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 中创建一个函数或别名。

相关内容