다음 중 어느 경로가 우선합니까: /usr 또는 /usr/local

다음 중 어느 경로가 우선합니까: /usr 또는 /usr/local

apt를 사용하여 aria2c를 설치했기 때문에 aria2c복사하여 수동으로 설치 하고 싶습니다 ./usr/local/bin/usr/bin

입력하면 다음 중 어느 것이 실행되나요 aria2c?

답변1

실행될 실행 파일은 변수의 디렉터리 순서에 따라 달라집니다 PATH.

/usr/bin앞에 나열된 경우 대신 실행 /usr/local/bin됩니다 ./usr/bin/aria2c/usr/local/bin/aria2c

쉘이 실행 파일을 해시하고 aria2c에서 동일한 유틸리티를 설치하기 전에 해당 실행 파일에 액세스한 경우 에서 디렉토리 순서에 관계없이 그렇게 하도록 선택할 수 있습니다. 이 문제는 유틸리티를 사용하고 다른 위치에 설치한 다음 동일한 셸 세션에서 다시 사용하려고 시도하는 특정 경우에만 발생할 수 있습니다. 이 명령은 쉘 세션에서 기억된 유틸리티 위치를 지웁니다. 당신은 또한 볼 수 있습니다/usr/bin/usr/local/bin/usr/bin/aria2cPATHhash -rBash의 실행 파일 경로 캐시를 지우는 방법은 무엇입니까?

라는 별칭이나 셸 함수가 있는 경우 셸이 실행 파일을 찾기 위해 이를 사용하기 전에 사용됩니다 aria2c.PATH


개인용(Linux가 아닌) 시스템에서:

$ printf '%s\n' "$PATH" | tr ':' '\n'
/usr/bin
/bin
/usr/sbin
/sbin
/usr/X11R6/bin
/usr/local/bin
/usr/local/sbin
/usr/games

보시다시피 내 시스템에서는 /usr/local/bin시간이 매우 늦었습니다 . /usr/bin저는 이렇게 설정했어요피하다실수로 재정의되었습니다 /usr/bin. 로컬 실행 파일이 /usr/bin.

답변2

이 SE 사이트에서 답변을 찾을 수 없다는 것이 이상합니다.

PATH이는 쉘에 따라 다르지만 일반적으로 명령을 실행하기 위해 쉘이 확인하는 디렉토리가 포함된 환경 변수가 있습니다 . 이러한 디렉토리는 세미콜론으로 구분됩니다 :.

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/wine/bin:/home/birdie/bin

바이너리는 왼쪽에서 오른쪽으로 검색됩니다. 즉, 제 예에서는 동일한 바이너리가 있으면 /usr/local/bin/bin중 하나가 /usr/local/bin우선순위를 갖습니다.

또한 셸에 별칭이 있으면 지원되는 기능이 먼저 실행됩니다(별칭이 정의된 경우). alias및 를 실행하여 볼 수 있습니다 set. 또 다른 카테고리 명령이 있습니다 built-in. 따라서 순서는 다음과 같습니다.

  • 별명
  • 기능
  • 내장 명령
  • $PATH왼쪽에서 오른쪽으로 검색되는 바이너리 파일

마지막으로 주목할 가치가 있는 것은 별칭(alias)입니다.아니요쉘 스크립트에서 작동합니다(정의되지 않음).

답변3

더 간단한 해결책은 which실행될 프로그램을 보는 것입니다.

맨페이지...

이 매개변수가 쉘 프롬프트에 입력되면 실행되는 실행 파일의 전체 경로를 표준 출력으로 인쇄합니다.

예:

[~] echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/13/bin:/usr/lib/llvm/12/bin
[~] echo '#!/bin/bash' > hello_world.sh
[~] echo 'echo "Hello World"' >> hello_world.sh
[~] chmod 755 hello_world.sh 
[~] sudo cp hello_world.sh /bin/
[~] sudo cp hello_world.sh /usr/bin/
[~] sudo cp hello_world.sh /usr/local/bin/
[~] which hello_world.sh
/usr/local/bin/hello_world.sh

다음에 추가

hash명령이 실행되는 방식을 변경할 수 있다는 점이 내 관심을 끌었습니다 . 그러나 대부분의 경우 프로그램은 성능 향상을 위해 해시되지 않습니다. 내 해시 목록에는 항상 두 개의 명령만 있습니다.

[~] hash
hits    command
   3    /usr/bin/man
   1    /bin/bash

명령을 해시하지 않는 한 which명령은 문제가 없습니다. 아니면 대신 사용하세요 type -p hello_world.sh. 이 명령도 비슷한 type부분입니다. 왠지 서로 소통이 되는 것 같아요.bashhash

저장하려면 hash매개변수 없이 명령을 호출하여 모든 해싱 프로그램을 볼 수 있습니다.

관련 정보