저는 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
메시지가 나타날 때마다 프로젝트 디렉터리에 있는지 확인하고, 해당하는 경우에만 함수를 생성합니다.
funcsave
fish_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는 쉘 확장입니다. 현재 디렉터리를 기반으로 환경 변수를 로드 및 언로드하는 새로운 기능으로 기존 셸을 향상합니다.