[Ubuntu] 사용 중인 명령어가 포함된 패키지명 검색

[Ubuntu] 사용 중인 명령어가 포함된 패키지명 검색
Photo by Gabriel Heinzer / Unsplash

리눅스를 주제로 블로그를 운영하다보면, 어려운 점이 포스트를 읽은 사용자가 "저는 그런 명령어가 없어요!"와 같은 독자와 필자 간의 환경의 차이점이다. 최대한 많은 사용자에게 적용이 될 수 있도록 포스트를 작성하려고 노력하지만... 매번 시스템을 초기화해서 테스트를 해볼 수도 없는 노릇이니 최대한 그 갭 차이를 줄이려고 테스트환경을 명기해두거나 오류 시의 대처방안 등 여러 설명을 덧붙이곤 한다. 그래도 여전히 너무나 다양한 환경차이는 여전히 극복하기 어려운 것이 현실이다.

이번 포스트에서는 환경차이 중에서 CLI(Command-Line Interface) 환경에서의 명령어(Command)에 대한 갭차이를 줄여보고자 찾아본 자료를 기반으로 작성되었다.[1]


  1. 사실 해당 문서의 링크(참고문서 #1)만 보관해도 될 정도의 수준이지만, 웹상의 문서나 유튜브 동영상 같은 자료는 언제 삭제될 지 모르고.. 찾은 자료에 대해서 이렇게 포스트로 옮기다보면 기억에 각인되는 효과가 있어서 "설명"이라는 살을 덫붙여서 포스트로 만들었다. 만약 원저작자(helperchoi)님이 삭제를 요청하면 본 포스트는 언제든 삭제될 수 있다. ↩︎

A. 테스트 환경

  • OS : Ubuntu 22.04.2 LTS (Jammy Jellyfish)
  • Kernel : 5.19.0-46-generic

B. 명령어

$ which [명령어]
$ dpkg -S [which 결과]

C. 테스트

$ which curl
/usr/bin/curl
$ dpkg -S /usr/bin/curl
curl: /usr/bin/curl

curl 명령어가 없을 수 있는 독자를 위해서 어떤 패키지를 설치해야하는지 안내를 하고 싶었다. 이 경우에는 dpkg -S 명령어를 이용해서 찾으면 된다!

위 경우라면 포스트에 아래처럼 넣어주면 될 것 같다.

curl 명령어가 없으면 아래의 명령어로 패키지를 설치하면 된다.

$ sudo apt install curl

D. 예외사항 - 1

그런데.. 여러 명령어를 테스트해보니 정상적으로 패키지명이 검색되지 않는 명령어들이 있었다. 이 경우는 보통 심볼릭링크와 관련이 있을 것으로 추정된다.

$ which vim
/usr/bin/vim
$ dpkg -S /usr/bin/vim
dpkg-query: no path found matching pattern /usr/bin/vim

vim 명령어를 조회해보니 명령어의 절대경로가 /usr/bin/vim으로 나온다. 그래서 dpkg 명령어로 조회해봤는데 /usr/bin/vim이 있는 패키지가 조회되지 않았다.

$ ls -l /usr/bin/vim
lrwxrwxrwx 1 root root 21  3월 10 10:14 /usr/bin/vim -> /etc/alternatives/vim
$ ls -l /etc/alternatives/vim
lrwxrwxrwx 1 root root 18  3월 10 10:14 /etc/alternatives/vim -> /usr/bin/vim.basic
$ ls -l /usr/bin/vim.basic
-rwxr-xr-x 1 root root 3783632  6월 22 13:08 /usr/bin/vim.basic
$ dpkg -S /usr/bin/vim.basic
vim: /usr/bin/vim.basic

그래서 ls 명령어로 확인해보니 해당 파일은 심볼릭링크로 연결되어있는 파일이었다.

/usr/bin/vim -> /etc/alternatives/vim -> /usr/bin/vim.basic로 다단계의 심볼릭링크로 연결되어있는데 실제로 해당 명령어의 실행파일은 /usr/bin/vim.basic이었던 것이다. 그래서 /usr/bin/vim.basic으로 검색해보니 정상적으로 조회가 됬다.

E. 예외사항 - 2

또 다른 예외로는 ifconfig 명령어였다. 머릿속의 기억으로는 Ubuntu에서 net-tools라는 패키지에 ifconfig 명령어가 포함되어 있는 것으로 알고있었다.

$ which ifconfig
/usr/sbin/ifconfig
$ dpkg -S /usr/sbin/ifconfig
dpkg-query: no path found matching pattern /usr/sbin/ifconfig
$
$
simplism@simplism-xnote:~$ ls -l /usr/sbin/ifconfig
-rwxr-xr-x 1 root root 79024  3월 25  2022 /usr/sbin/ifconfig

그래서 검색했더니 실행파일의 위치가 /usr/sbin/ifconfig였고... 검색했는데 검색실패! 그래서 실행파일이 심볼릭링크인가 봤는데 아니었다.

더 찾아보니...

$ dpkg -S ifconfig
net-tools: /sbin/ifconfig
net-tools: /usr/share/man/de/man8/ifconfig.8.gz
linux-hwe-5.19-headers-5.19.0-45: /usr/src/linux-hwe-5.19-headers-5.19.0-45/tools/hv/hv_set_ifconfig.sh
net-tools: /usr/share/man/man8/ifconfig.8.gz
net-tools: /usr/share/man/pt_BR/man8/ifconfig.8.gz
net-tools: /usr/share/man/fr/man8/ifconfig.8.gz
linux-hwe-5.19-headers-5.19.0-46: /usr/src/linux-hwe-5.19-headers-5.19.0-46/tools/hv/hv_set_ifconfig.sh
$ ls -l /sbin
lrwxrwxrwx 1 root root 8  3월 10 09:36 /sbin -> usr/sbin

경로를 제외하고 ifconfig로만 검색해보니 /sbin/ifconfig가 나왔다. 그래서 /sbin을 확인해보니.... /sbin -> /usr/sbin으로 심볼릭링크가 연결되어 있던 것이다!

결국 실행파일 자체가 심볼릭링크이거나 디렉토리 자체가 심볼릭링크인 경우에는 검색이 정상적으로 되지 않는 것이다.

E. 대응방안

위 ifconfig 명령어와 같이 which 명령어로 조회된 절대경로로 조회되지 않는 경우라면 경로를 제외한 명령어만으로 검색해보면 해당 명령어가 포함된 패키지를 찾을 수 있을 것 같다.

G. 참고문서

  1. 내가 원하는 명령어가 포함된 패키지를 찾는 방법, helperchoi, helperchoi, 2019/10/13