Linux에서 which 명령을 사용하는 방법

Linux which 명령은 쉘에 명령을 실행할 때 실행되는 실행 가능한 바이너리를 식별합니다. 컴퓨터에 동일한 프로그램의 다른 버전이 있는 경우 어느 것을 사용하여 셸에서 사용할 프로그램을 찾을 수 있습니다.

바이너리 및 경로

터미널 창에서 프로그램이나 명령을 실행하려고 하면 셸(보통, 세게 때리다 최신 배포판에서) 해당 명령을 찾아 실행해야 합니다. 다음과 같은 일부 명령 CD, 역사, 그리고 암호, 쉘에 내장되어 있으므로 Bash는 이것을 찾기 위해 너무 열심히 일할 필요가 없습니다.

그러나 Bash는 다른 명령, 프로그램 및 외부 독립 실행형 바이너리를 어떻게 찾습니까? 음, Bash는 실제로 경로의 모음인 경로를 사용합니다. 각 경로는 디렉토리를 가리킵니다. 그런 다음 실행하려는 명령이나 프로그램과 일치하는 실행 파일이 있는지 해당 디렉터리 각각을 검색합니다. 하나를 찾으면 Bash는 이를 실행하고 검색을 중단합니다.

echo를 사용하여 $PATH 환경 변수를 확인하고 경로의 디렉토리를 볼 수 있습니다. 그렇게 하려면 다음을 입력하고 Enter 키를 누릅니다.

echo $PATH

그만큼

출력 목록은 각 경로를 콜론(:)으로 구분합니다. 우리가 사용하는 컴퓨터에서 Bash는 다음 디렉토리를 이 순서로 검색합니다.

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/큰 상자
/사용자/게임
/usr/local/games
/스냅/빈

파일 시스템에는 /sbin 및 /bin이라는 폴더가 많이 있어 혼동을 줄 수 있습니다.

그 길을 조심하십시오

htg라는 프로그램의 업데이트된 버전이 있다고 가정해 보겠습니다. 현재 디렉토리에 있으며 다음 명령을 입력하여 실행할 수 있습니다.

./htg

그만큼

그다지 많은 프로그램이 아닙니다. 버전 번호를 인쇄한 다음 닫힙니다. 새 버전은 1.2.138입니다.

현재 작업 디렉토리에서 프로그램을 실행하려면 프로그램 이름 앞에 “./”를 입력해야 Bash가 찾을 위치를 알 수 있습니다.

이 특정 프로그램을 모든 디렉토리에서 실행하기를 원하기 때문에 실행 파일을 /usr/bin 디렉토리로 이동합니다. Bash는 경로에서 해당 프로그램을 찾아 실행합니다.

  Photoshop에서 Adobe 웹용 저장 오류를 수정하는 방법

현재 디렉토리에 실행 파일이 필요하지 않으며 아래와 같이 프로그램 이름 앞에 “./”를 입력할 필요도 없습니다.

sudo mv htg /usr/bin

그만큼

이제 다음을 입력하여 프로그램을 실행해 보겠습니다.

htg

그만큼

무언가가 실행되고 있지만 이것은 우리의 새로운 업데이트된 프로그램이 아닙니다. 오히려 이전 버전인 1.2.105입니다.

어느 명령

위에서 설명한 문제는 왜 which 명령이 설계되었다.

이 예에서는 which를 사용하고 조사 중인 프로그램의 이름을 명령줄 매개변수로 전달합니다.

which htg

그만큼

/usr/local/bin 디렉토리에서 htg 버전이 발견되었다고 보고합니다. 그 위치는 업데이트된 htg를 이동한 디렉토리 이전의 경로에 나타나므로 Bash는 이전 버전의 프로그램을 사용합니다.

그러나 아래와 같이 -a(all) 옵션을 사용하면 일치하는 항목을 찾으더라도 계속 검색합니다.

which -a htg

그만큼

그런 다음 경로의 모든 디렉토리에서 일치하는 모든 항목을 나열합니다.

그래서, 그것이 문제입니다. 패치에도 있는 디렉토리에 프로그램의 이전 버전이 있습니다. 그리고 그 디렉토리는 우리가 프로그램의 새 버전을 떨어뜨린 디렉토리보다 먼저 검색되고 있습니다.

확인하기 위해 다음을 입력하고 프로그램의 각 버전을 명시적으로 실행할 수 있습니다.

/usr/local/bin/htg
/usr/bin/htg

이것은 문제를 설명하고 해결책은 간단합니다.

사실, 우리는 선택권이 있습니다. /use/local/bin 디렉토리에서 이전 버전을 삭제하거나 /usr/bin에서 /usr/local/bin으로 이동할 수 있습니다.

그 결과 보기

두 개의 결과가 반드시 두 개의 바이너리 파일을 의미하지는 않습니다.

-a(all) 옵션과 함께 which 명령을 사용하고 less 프로그램의 버전을 찾는 예를 살펴보겠습니다.

which -a less

그만큼

less 프로그램의 버전이 있는 두 위치를 보고하지만 그게 사실입니까? Linux 컴퓨터에 덜 설치된 두 개의 다른 버전(또는 여러 위치에 있는 동일한 버전)이 있는 것은 이상할 것입니다. 그래서 우리는 그 출력을 받아들이지 않을 것입니다. 대신, 조금 더 깊이 파헤쳐 보겠습니다.

ls, -l(긴 목록) 및 -h(사람이 읽을 수 있음) 옵션을 사용하여 진행 상황을 확인할 수 있습니다.

ls -lh /usr/bin/less

그만큼

파일 크기는 9바이트로 보고됩니다! 그것은 확실히 덜의 전체 사본이 아닙니다.

  파일의 텍스트 문자열 바꾸기 [Guide]

목록의 첫 번째 문자는 “l”입니다. 일반 파일에는 첫 번째 문자로 하이픈(-)이 있습니다. “l”은 심볼릭 링크를 의미하는 심볼입니다. 해당 세부 사항을 놓친 경우 -> 기호도 이것이 심볼릭 링크, 일종의 지름길이라고 생각할 수 있습니다. 이것은 /bin에 있는 less의 복사본을 가리킵니다.

/bin에 있는 less 버전으로 다시 시도해보자:

ls -lh /bin/less

그만큼

이 항목은 분명히 “실제” 바이너리 실행 파일입니다. 목록의 첫 번째 문자는 하이픈(-)으로 일반 파일이며 파일 크기는 167KB입니다. 따라서 less의 사본 하나만 설치되지만 다른 디렉토리에서 이에 대한 심볼릭 링크가 있습니다. Bash는 경로를 검색할 때도 이 디렉토리를 찾습니다.

한 번에 여러 명령 확인하기

여러 프로그램과 명령을 전달할 수 있으며 순서대로 확인합니다.

예를 들어 다음을 입력하는 경우:

which ping cat uptime date head

그만큼

제공한 프로그램 및 명령 목록을 통해 작동하고 각각에 대한 결과를 나열합니다.

어느 것이 어느 것입니까?

그렇게 하고 싶다면 다음을 입력하여 which 자체를 사용할 수도 있습니다.

which which

호기심으로 Linux 파일 시스템을 뒤지는 것 외에는 명령이나 프로그램에서 한 세트의 동작을 예상했지만 다른 세트를 얻을 때 가장 유용합니다.

이러한 경우 Bash가 시작하는 명령이 사용하려는 명령인지 확인하기 위해 which를 사용할 수 있습니다.