print -P가 환경 변수를 대체하지 못하도록 방지

print -P가 환경 변수를 대체하지 못하도록 방지

나는 사용하고있다팁 퓨어zsh에서 메시지가 표시되었습니다. print -Pn ...현재 디렉토리를 인쇄하기 위해 내부적으로 사용됩니다 . 어떤 이유로 현재 디렉터리의 시작 부분과 일치하는 환경 변수를 설정하면 해당 환경 변수 이름이 출력으로 대체됩니다.

예를 들어,

> export SOME_DIR=/home/bschlenk/some/path
> cd ~/some/path/deeper/nested/path
> print -Pn %~
~SOME_DIR/deeper/nested/path

임의의 환경 변수를 일치하는 경로로 바꾸는 것을 방지하는 방법은 무엇입니까? 현재 경로를 인쇄하고 /home/bschlenk로 바꾸고 싶지만 ~다른 것은 없습니다.

답변1

~에서선적 서류 비치%~:

접두사로 명명된 디렉터리가 있는 경우 해당 부분은 ~디렉터리 이름으로 대체되지만 결과가 전체 경로보다 짧은 경우에만 해당됩니다.

참고사항은 다음과 같습니다동적그리고변화 없는디렉터리 이름을 지정합니다. 당신이 보는 것은 정적으로 이름이 지정된 디렉토리입니다

다음 텍스트가 ~값이 로 시작하는 문자열 쉘 매개변수의 이름 인 경우에도 정의할 수 있습니다 /.

따라서 변수의 값이 이면 값이 SOME_DIR. 인 정적으로 이름이 지정된 디렉터리입니다 . 프롬프트 확장은 이를 보고 축약합니다 ./home/bschlenk/some/path~SOME_DIR/home/bschlenk/some/path%~/home/bschlenk/some/path~SOME_DIR

그러나 그것이 전부는 아닙니다. 실제로 약어는 SOME_DIR"활성화"를 사용할 때만 나타납니다 ~SOME_DIR. 이 내용은 다음과 같이 기록됩니다.옵션auto_name_dirs, 사전 활성화가 필요하지 않지만 기본적으로 꺼져 있습니다.

디렉토리의 절대 이름으로 설정된 모든 매개변수는 즉시 해당 디렉토리의 이름이 되며, 관련 프롬프트 시퀀스에서 사용되며 %~로 시작하는 단어 완성을 수행할 때 사용할 수 있습니다 ~. (그렇지 않으면 해당 매개변수를 ~param먼저 양식에 사용해야 합니다.)

교체를 활성화 %~하고 완료하는 매개변수 ~는 다음과 같이 표시됩니다.명명된 디렉터리 해시 테이블목록을 사용할 수 있습니다 hash -d.

우리는 무슨 일이 일어났는지 이해하기 위해 조각들을 하나로 모았습니다. 문제를 어떻게 해결하나요? SOME_DIR활성화 원인에 따라 다릅니다 .

이 옵션이 켜져 있으면 auto_name_dirs당연히 꺼야 합니다.

이전에 사용하고 있었다면 ~SOME_DIR다음을 사용하여 비활성화할 수 있습니다.

unhash -d SOME_DIR

이는 영구적이지 않습니다. 다시 사용하면 다시 팝업됩니다 ~SOME_DIR. 하지만 $SOME_DIR가능한 모든 곳에서 사용할 수 있다는 점을 고려 ~SOME_DIR하면 ~SOME_DIR그다지 유용한 기능은 아닙니다.

명명된 디렉터리 구성 요소 를 제거할 수 없고 →를 SOME_DIR사용하여 $HOME현재 디렉터리를 축약하려는 경우 ~이 변환을 수동으로 구현할 수 있습니다.

if [[ $PWD = $HOME ]]; then
  HPWD=\~
elif [[ $PWD = $HOME/* ]]; then
  HPWD=\~/${PWD#$HOME/}
else
  HPWD=$PWD
fi

print -rn $HPWD그런 다음 대신 사용하십시오 print -Pn %~.

SOME_DIR디렉토리 이름 지정을 막을 수 없고 사용된 코드를 변경할 수 없다면 %~상황은 더욱 까다로워집니다 . 명확한 디렉토리 hashtable 을 사용할 수 있지만 hash -r함수에 대해 로컬로 만들 수는 없습니다(서브쉘에만 해당).

관련 정보