find, fzf 및 xargs를 사용하여 파일 소스를 얻을 수 없습니다.

find, fzf 및 xargs를 사용하여 파일 소스를 얻을 수 없습니다.

fzf를 사용하여 다양한 가상 환경을 선택하고 활성화하려고 합니다. 그러나 다음과 같은 오류가 발생합니다.
xargs: source: No such file or directory

내 명령은 세 부분으로 구성됩니다. 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를 어떻게 얻나요?

추신 - 파일 이름에 공백이 포함된 경우 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현재 셸에서 함수나 별칭을 만듭니다.

관련 정보