특정 디렉토리에만 Fish Shell 별칭이 있습니다.

특정 디렉토리에만 Fish Shell 별칭이 있습니다.

저는 Fish를 사용하고 있으며 이라는 빌드 작업을 위해 자주 호출되는 스크립트가 포함된 프로젝트를 작업하고 있습니다 x.py. x에 매핑되는 별칭을 만들고 싶습니다 ./x.py. 그러나 나는 이것이 해당 특정 디렉토리에서만 작동하기를 원합니다.

Fish 문서는 다양한 별칭/함수/등을 생성하는 방법에 대한 매우 자세한 설명을 제공하지만 이를 디렉토리별로 만드는 방법에 대해서는 아무것도 찾을 수 없습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

제가 생각할 수 있는 가능성은 세 가지입니다(Damiel이 제안한 것 외에). 먼저, 가능하다면 "지연 로드" 기능의 디렉토리에 있는지 테스트하겠습니다. 이는 Damir가 제안한 것과 유사하지만 시작 구성이나 실행 가능한 스크립트의 오버헤드를 방지합니다.

지연 로딩 기능 기반 솔루션

만들다 ~/.config/fish/functions/x.fish:

function x
    if [ (pwd) = "/path/to/project` ]
        ./x.py
    else
        command x
    end
end

이 함수는 처음 호출될 때만 로드됩니다 x. 이렇게 하면 실행 구성에 추가하는 오버헤드가 방지됩니다. 이는 여전히 함수이므로 fish실행 가능한 스크립트처럼 새 셸을 시작하는 대신 현재 셸에서 실행됩니다.

x해당 디렉토리에 없으면 시스템에 설치되어 있는 다른 명령으로도 대체됩니다. 필요하지 않은 경우 else블록을 삭제하면 됩니다.

프로젝트 디렉토리 진입 시 생성되는 함수

만약 너라면진짜이 기능은 해당 디렉터리에 있는 경우에만 필요하며 두 가지 옵션이 있습니다. 첫째, fish 함수는 변수의 변경 사항을 모니터링하고 변수가 변경될 때만 실행될 수 있습니다. 이 변수는 $PWD디렉터리 변경 사항을 모니터링하는 데 사용할 수 있습니다.

다음을 추가하십시오 ~/.config/fish/conf.d/create_x.fish.

function create_x --on-variable PWD
    if [ "$PWD" = "/path/to/project" ]
        function x
            ./x.py
        end
    else
        functions --erase x
    end
end

create_x.fish시작 시 함수를 로드 해야 하지만 디렉터리를 변경할 때만 실행됩니다. 확실히 첫 번째 옵션보다 효율성이 떨어집니다.

프롬프트 기반 기능

마지막으로 프롬프트 기능을 수정하여 현재 디렉터리를 확인할 수 있습니다. 이는 낭비적인 것처럼 보이지만 다음과 같습니다.

  • funced fish_prompt

  • 하단에 다음을 추가합니다.

    functions --erase x
    if [ (pwd) = "/path/to/project" ]
        function x
            ./x.py
        end
    end
    
  • funcsave fish_prompt

메시지가 나타날 때마다 프로젝트 디렉터리에 있는지 확인하고, 해당하는 경우에만 함수를 생성합니다.

funcsavefish_prompt디렉터리 에 "일반" 복사본을 저장합니다 ~/.config/fish/functions. 일반 프롬프트 기능으로 돌아가려면 이를 제거하세요.

물론 가능하다면 첫 번째 옵션을 선택하세요 :-)

답변2

마침내 누군가 이것을 원합니다!

여전히 관심이 있으시다면 현재 있는 디렉터리에 따라 함수를 동적으로 로드/언로드하는 데 사용하는 "Dangerload"라는 작은 프로젝트가 있습니다. 당신은 복사할 수 있습니다이것. 에 파일을 저장 ./config/fish/functions하거나 그냥 실행하세요.fisher install redaphid/dangerload-fish

또한 디스크의 함수가 변경되었는지 확인하고 실행 전에 자동으로 함수를 업데이트합니다.

direnv와 유사하지만 Fish 기능에 사용됩니다.

이름에서 알 수 있듯이 현재 있는 폴더의 소스를 신뢰하지 않으면 이는 극단적인 결과를 초래합니다. 따라서 이 동작을 선택하려면 터미널 세션당 한 번씩 "dls"를 입력해야 합니다. ㅋ.

예전에는 좀 더 고급 버전이 있었지만 이 버전은 파일을 살펴보고 ./scripts/dangerload.fish거기에서 셸에 추가/제거하려는 기능을 추출했습니다. 이 디렉토리에서 CD를 꺼내면 이러한 기능이 제거됩니다.

저는 이 아이디어에 대해 오랫동안 흥미를 느꼈습니다. 왜냐하면 범위가 현재 있는 폴더로 제한되어 셸에서 도메인별 언어를 사용할 수 있기 때문입니다. 작업을 수행하거나 위험한 페이로드를 사용하여 해당 쉘 스크립트에서 모든 기능을 추출하기 위해 실행할 수 있는 프로젝트용 쉘 스크립트를 만들었습니다. 당신이나 누군가가 이것으로부터 가치를 얻을 수 있다고 생각한다면 Github에서 저에게 연락하십시오. 나에게는 이 일을 하는 더 나은 것이 있습니다.

답변3

별칭으로는 이것이 가능하지 않다고 생각합니다(단독으로 사용하는 경우).

해결책:

  • ~/.config/fish/config.fish에 함수 생성

      function x
        set desired_dir "/home/student/test_x" # Set your absolute path to your desired directory
        if test (pwd) = $desired_dir
          ./x.py
        else
          echo '"Alias" x :) is not allowed here! You are not in $desired_dir directory.'
        end
      end
    

    config.fish 파일이 없으면 위의 코드를 사용하여 생성하세요.

  • x다음 코드를 사용하여 이름이 지정된 스크립트/파일을 만듭니다.

    #!/usr/bin/fish
    
    set desired_dir "/home/student/test_x" # Set your absolute path to your desired directory
    if test (pwd) = $desired_dir
      ./x.py
    else
      echo '"Alias" x :) is not allowed here! You are not in $desired_dir directory.'
    end
    

    파일을 실행 가능하게 만드는 것을 잊지 마십시오 x.

    chmod u+x ~/bin/x
    

답변4

나는 사용하는 것이 좋습니다디렌프, 그 다음에direnv를 물고기에 낚아채기폴더를 기반으로 맞춤 변수를 설정합니다.

그런 다음 Fish 함수에서 변수를 사용합니다.

direnv는 쉘 확장입니다. 현재 디렉터리를 기반으로 환경 변수를 로드 및 언로드하는 새로운 기능으로 기존 셸을 향상합니다.

관련 정보