환경을 현재 디렉터리에 종속되게 만드는 방법 [복제]

환경을 현재 디렉터리에 종속되게 만드는 방법 [복제]

현재 디렉토리가 쉘 환경을 결정한다면 이것이 유용/편리할 것이라고 생각합니다. 이는 명령이

cd /my/projects/foo

...예를 들어, 현재 작업 디렉토리가 설정될 뿐만 아니라( update , , $PWD, 등) 다른 많은 환경 요소(셸 옵션, 변수, 함수, 별칭 등)도 조정됩니다. 단일 파일. 이 방법은 새로운 콘텐츠에 맞게 조정됩니다.$OLDPWD$dirstackPWD

언뜻 보면 이는 구현하는 비교적 간단한 방법처럼 보입니다. 특히 zsh이미 chpwd후크와 $chpwd_functions배열을 지원하기 때문입니다. 그러나 그들이 말했듯이 악마는 세부 사항 에 있습니다1 .

그래서 내 자신의 연습을 시작하기 전에 질문해야 한다고 생각했습니다. 이 아이디어의 성숙한 구현을 아는 사람이 있습니까?

아니면 chpwdet al. 외에 zsh이와 같은 작업을 수행하는 데 도움이 되는 다른 도구가 있습니까? 특히 패키징/저장/복원 환경에 대한 지원을 제공합니까? (환경 개체와 같은 것을 생각하고 있지만 R변수뿐만 아니라 별칭, 옵션 등도 생각하고 있습니다.)


FWIW, 나는 virtualenv이 기사에 설명된 아이디어와 일부 기능을 공유하는 Python을 알고 있지만 물론 이는 Python 관련 설정으로 제한됩니다. 또한 "현재 작업 디렉터리" 상태 변수에 포함되지 않고 직교하는 "현재 가상 환경"인 새로운 "상태 변수"를 생성합니다.


1 이 문제를 좀 더 자세히 살펴보면 몇 가지 중요한 질문이 빠르게 떠오릅니다. 예: 사용자 정의 환경을 활성화 cd하려는 경우 그 후에는 어떻게 되나요 ? 파일 시스템의 트리 구조로 나누어진 중첩된 사용자 정의 환경을 가질 수 있습니까? 심볼릭 링크는 어떻습니까? 예를 들어 실제로 심볼릭 링크라면 어떻게 될까요 ? 또는 while is를 수행하면 결과 프로세스의 환경은 어떻게 되어야 합니까? 잠깐, 잠깐, 잠깐. 나는 이러한 문제가 반드시 다루기 힘든 문제라고 생각하지 않지만, 적어도 완전히 사소하지는 않다고 생각합니다./my/projects/foocd /my/projects/foo/modules/bar/my/projects/foo/modules/bar/my/shared/modules/bar/my/projects/foo/some_program$PWD/tmp

답변1

특정 디렉터리에 대한 환경 변수를 설정하도록 설계된 성숙한 도구가 있습니다.

이 목적을 위해 설계된 다른 도구와 비교할 때,direnv그 중 최고입니다. 주요 이점 중 하나는 지원한다는 것입니다.제거하다디렉토리를 종료할 때 환경 변수를 변경하십시오.

direnv쉘 환경 전환기입니다. bash, zsh, tcsh, fish shell 및 elvish를 연결하여 로드하거나 로드하는 방법을 알고 있습니다.제거하다환경 변수는 현재 디렉터리에 따라 다릅니다. 이를 통해프로젝트별 환경~/.profile파일을 어지럽히 지 않고 변수를 정리합니다 .

direnv다른 유사한 도구와의 차이점은 무엇입니까?

  • direnvGo로 작성되었습니다.서둘러요Python으로 작성된 대응 항목과 비교
  • direnv지원하다제거하다특정 디렉터리를 종료할 때 환경 변수 사용
  • direnv많은 껍질로 덮여있다

유사한 프로젝트

  • 환경 모듈- 가장 오래된(좋은 의미에서) 환경 로딩 시스템 중 하나
  • 자동 환경- Light는 제거를 지원하지 않습니다. Python으로 작성하면 매우 느립니다.
  • zsh-autoenv- 풍부한 기능을 갖춘 autoenv와스마트 CD: 이벤트 입력/나가기, 중첩, 숨기기(Zsh에만 해당).
  • 아스다프- 플러그인 시스템을 갖춘 순수 bash 솔루션

관련 정보