옵션 1: 보다 적절하게 배치된 심볼릭 링크

옵션 1: 보다 적절하게 배치된 심볼릭 링크

저는 macOS를 사용하고 있고 쉘은 zsh입니다. 기본적으로 내 시스템의 홈 디렉터리는 입니다 /Users/njohn. 나는 이 경로에 대한 심볼릭 링크를 만들었습니다 /usr/local/home. 나는 HOME="/usr/local/home".zshrc. 먼저 홈 디렉토리에서 신속하게 모든 홈브류 패키지와 구성 파일이 있는 위치 cd ..에 있도록 이 작업을 수행했습니다. /usr/local정말 간단한 단축키입니다. 또한 나는 일반적인 경로가 아닌 심볼릭 링크된 경로를 사용하고 도달할 수 있다는 점을 좋아합니다 cd. 이는 파일 시스템에서 내가 더 가까이 느끼고 싶은 것과 멀리 떨어져 있습니다.

이것이 무엇이든 깨뜨릴 수 있습니까? 동일한 작업을 수행할 수 있는 더 안전하거나 더 나은 방법이 있습니까?

답변1

부인 성명: 저는 MacOS를 사용해본 적이 없고 사용해 본 적이 없기 때문에 Mac과 *nix 사이에 어떤 불규칙성이나 미묘한 차이가 존재할 수 있는지 완전히 확신할 수 없습니다.

귀하의 질문에 대답하자면, 이 설정에서 "손상"이 발생할 수 있다고 상상할 수 있는 유일한 시나리오는 특정 프로그램이 홈 디렉터리로 작업을 시도하고 기본적으로 심볼릭 링크를 따르지 않는 경우입니다(또는 어떤 이유로든 전혀 따르지 않는 경우). . 가상의 프로그램이 홈 디렉토리의 일부 파일을 읽고 쓰려고 시도하고 심볼릭 링크를 확인하지 못하면 /usr/local/home문제가 발생할 수 있습니다. 그러한 시나리오가 일어날 가능성은 저에게는 없습니다.

즉, 변수 를 수정하지 않는 접근 방식을 사용하는 것이 더 나을 것이라고 생각합니다 $HOME. $HOME시작하는 모든 대화형 쉘의 수명 동안 시스템이 홈 디렉토리를 이해하는 것과 다른 것으로 변수를 변경하는 것은 추악하고 해킹적이며 미묘한 문제를 일으킬 수 있습니다. 세 가지 더 나은 대안을 제시하겠습니다.

옵션 1: 보다 적절하게 배치된 심볼릭 링크

심볼릭 링크를 계속 사용하려면 /usr/local홈 디렉터리에서 에 심볼릭 링크를 만들고 /usr/local/home현재 있는 링크를 제거한 $HOME다음 .zshrc. 예를 들어:

% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local

현재 가지고 있는 것과 유사하게 홈 디렉토리에서 /usr/local로 빠르게 이동할 수 있습니다. 단, 이 방법을 사용하면 변경할 필요가 없습니다 $HOME.

옵션 2: 명명된 디렉터리

Zsh를 사용하고 있으므로 다음을 사용하는 것이 좋습니다.명명된 디렉터리. 대신 HOME=/usr/local/home다음과 같은 작업을 수행하여 uloc원하는 짧은 이름으로 바꾸세요.

uloc=/usr/local

그런 다음 이 디렉터리로 빠르게 전환할 수 있습니다.어디에서나다음과 같은 방법으로:

# With no special options set
% cd ~uloc

# Slightly shorter
% setopt cdable_vars
% cd uloc

# Even shorter
% setopt cdable_vars auto_cd
% uloc

보시다시피, 경로로 확장되는 변수 가 있는 cd경우 . 이름이 지정된 디렉터리는 원하는 만큼 많이 가질 수 있으므로 다음 디렉터리에 빠르게 액세스할 수 있습니다.~~user/home/user어느/usr/local귀하의 경우뿐만 아니라 자주 사용하는 디렉토리입니다 .

이 옵션을 사용하면 를 사용할 때 명명된 디렉터리에 대해 cdable_vars를 생략할 수 있으며 , 실제로 디렉터리(이름이 지정되었거나 리터럴임)인 "명령"을 입력하면 Zsh가 자동으로 해당 디렉터리로 이동한다는 의미입니다. 이 두 가지를 결합하면 원하는 디렉토리에 빠르게 액세스할 수 있습니다.~cdauto_cdcd당신이 어디에 있든 상관없이. 반대옵션 1, 심볼릭 링크에 의존하지 않기 때문에 cd이 명명된 디렉토리로 이동합니다.실제로 당신을 그 디렉토리에 넣을 것입니다, 이는 pwd반환되고 /usr/local그렇지 않을 것입니다 /Users/njohn/uloc.

옵션 3: CDPATH 사용

이 접근 방식은 단독으로 사용하거나 다음과 함께 사용할 수 있습니다.옵션 2.

디렉토리 목록을 보유하는 것과 $CDPATH같은 특수 변수인 를 사용할 수도 있습니다 . 그러나 $PATH달리 , 주어진 경로가 현재 디렉터리에서 발견되지 않으면 의 $PATH디렉터리는 $CDPATH주어진 상대 경로에 대한 "루트"로 사용됩니다 . cd시연하려면 다음을 고려하십시오.

# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]

share에 이름이 지정된 디렉토리가 없었기 때문에 ~/fooZsh는 하위 디렉토리가 될 수 있는 $CDPATH위치를 문의했습니다. 에 있었고 share은 의 하위 디렉토리이므로 내부에서 을 (를) 수행할 수 있습니다 . 더 깊이 들어갈 수도 있습니다. 예를 들어 가 의 하위 디렉터리인 경우 를 실행하여 해당 디렉터리로 이동할 수 있습니다 ./usr/local$CDPATHshare/usr/localcd share~/foostuff/usr/local/sharecd share/stuff

메모:Bash와 달리 Zsh는 항상 현재 디렉토리를 찾습니다.~ 전에에서 디렉토리를 시도하고 $CDPATH,~하지 않는 한a는 .에 포함되어 있습니다 $CDPATH. 이 경우 Zsh는 $CDPATH.

이렇게 하면 훨씬 더 편리해집니다. 말씀하신 대로 홈브류 패키지 및 구성에 액세스해야 하는 경우가 많기 때문에 cd어떤 종류의 접두사도 필요 없이 어디서나 해당 하위 디렉터리 중 하나로 들어갈 수 있기 때문입니다!

이미 언급했듯이 이를 명명된 디렉터리와 결합할 수 있습니다. 내 도트파일에서 예제를 가져오려면 다음을 수행하세요.

ZSH=~/.zsh
cdpath=(~/.zsh)

# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]

추가 자료

Zsh와 Zsh의 다양한 기능*에 더 익숙해지는 것이 좋습니다. 다음은 살펴볼 수 있는 몇 가지 매뉴얼 페이지와 기타 주제입니다.

  • symlink(7)— 심볼릭 링크와 심볼릭 링크의 상호 작용 방식을 자세히 설명합니다.
  • zshexpn(1), "정적 명명된 디렉터리" — 명명된 디렉터리를 설명하고 나머지 매뉴얼 페이지에서는 Zsh의 모든 확장 형태를 설명합니다.
  • zshparam(1), "PARAMETERS USED BY THE SHELL" — cdpath등과 같은 특수 변수에 대한 설명을 포함합니다.
  • zshoptions(1)— 내장을 통해 Zsh 동작을 제어하는 ​​모든 옵션을 자세히 설명합니다 setopt. 이 답변이 제공하는 것보다 cdable_vars더 자세한 설명이 포함되어 있습니다 .auto_cd

관련 정보