명령은 zsh에는 없지만 bash에는 있습니다.

명령은 zsh에는 없지만 bash에는 있습니다.

나는 우분투에 있고 다음 zsh과 같은 심볼릭 링크를 만들었습니다 bat.

ln -s /usr/bin/batcat /home/user_name/.local/bin/bat

실적 ls -l히트 ~/.local/bin:

lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat

이제 모든 디렉토리에서(내에서도 ~/.local/bin),

내가 달리면 bat나는 그것을 얻을 것이다 command not found: bat. 실행 ~/.local/bin도 작동하지 않습니다. 그러나 ./bat(에서 ~/.local/bin)를 실행하면 작동합니다. 달리기 batcat도 효과가 있습니다.

echo $PATH~/.local/bin경로에 표시

여기서 무엇이 잘못될 수 있나요? 심볼릭 링크는 작동하지 않습니다. bat단지 예일 뿐입니다.

PS bash에서는 모든 것이 예상대로 작동합니다.

답변1

PATH실제로 리터럴 물결표 문자를 포함 하면 ~/.local/bin작동하지 않습니다. 물결표를 홈 디렉터리로 확장해야 합니다.

예를 들어 다음 줄은 zsh, bash 또는 기타 sh와 유사한 셸에서 정확합니다.

PATH=~/.local/bin:$PATH
PATH=$PATH:~/.local/bin
PATH=~/.local/bin:"$PATH"
PATH="$PATH":~/.local/bin
export PATH="$HOME/.local/bin:$PATH"
export PATH="$PATH:$HOME/.local/bin"

~단어의 시작 부분, 할당문과 같은 기호 뒤 또는 할당문의 오른쪽 뒤에 올 때 홈 디렉토리로 확장되기 때문에 작동합니다 (이 마지막 규칙은 설정을 쉽게 하기 위한 것입니다).:PATH

그러나 이와 같은 줄은 PATH="~/.local/bin:$PATH"큰따옴표로 확장되지 않으므로 작동하지 않습니다. 따라서 최종 ~값에는 리터럴 문자가 포함됩니다. 이는 홈 디렉터리가 아닌 현재 디렉터리 내의 호출 디렉터리를 나타냅니다.PATH~PATH~

~Bash1 에는 경로 항목 시작 부분을 홈 디렉터리로 해석하는 기능이 있습니다 . bash에서도 PATH="~/.local/bin:$PATH"부분적으로 작동합니다 . 그러나 이는 bash 외부에서 프로그램 자체를 시작할 때가 아니라 bash에서 직접 프로그램을 실행하는 경우에만 작동합니다. 따라서 bash를 사용하더라도 ~경로에 리터럴을 넣지 말고 확장 또는 사용되었는지 확인하세요 $HOME.


sh이 기능은 POSIX 모드가 아닐 때(예: a로 실행되는 경우) POSIX 규정 준수를 깨뜨립니다. a는 현재 작업 디렉터리의 리터럴 하위 디렉터리에서 명령을 찾 PATH='~'도록 설계되었기 때문입니다.~

관련 정보