터미널, 셸 등에서 기본 C 기능과 기타 명령(sed, awk 등)을 사용하는 방법을 배울 때 운영 체제에 따라 동작이 조금씩 다르다는 것을 깨달았습니다. GNU 확장과 개발자의 보안 강화로 인해 배포판 간에는 물론 MacOS, Linux, BSD 간에도 미묘한 차이가 있습니다. 수십 개의 웹 페이지를 검색하지 않고도 내 시스템이 어떤 버전을 사용하고 있는지 어떻게 알 수 있나요?
man
도움이 안돼. 예를 들어 man printf
상태NOTE: your shell may have its own version of printf, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.
답변1
대부분의 명령에는 찾고 있는 정보를 출력하는 데 사용할 수 있는 옵션이 있습니다. 당신이 언급한sed,앗, --version 매개변수를 사용해 보세요:
Tux ~ $ awk --version
awk --version
GNU Awk 5.1.1, API: 3.1
전용 옵션이 항상 제공되는 것은 아닙니다.버전, yourcommand -h
일반적으로 알려주어야 하며, 그렇지 않은 경우 맨페이지를 참조하세요.
그런 점에서 특정 쉘 내장 기능이 종종 정보를 생성하지 않는 문제가 있다고 올바르게 작성하셨습니다 printf
.
Tux ~ $ printf --version
bash: printf: --: invalid option
printf: usage: printf [-v var] format [arguments]
맨페이지에 써있지만인쇄 기능--version 매개변수를 따릅니다.
이를 통해 내장된 기능을 사용하고 있음을 추론할 수 있습니다.인쇄 기능함께 제공되는 기능이 아닌 기능핵심 도구패키지, 버전은 다음을 사용하여 전체 경로를 트리거할 수 있습니다.
Tux ~ $ which printf
/usr/bin/printf
Tux ~ $ /usr/bin/printf --version
/usr/bin/printf --version
printf (GNU coreutils) 8.32
Packaged by Gentoo (8.32-r1 (p0))
답변2
대부분의 Bourne형 껍질에는
type cmd
(와 동일 command -V cmd
)은 쉘이 이를 다음과 같이 해석할 것이라고 알려줍니다 cmd
.
bash-5.2$ type time
time is a shell keyword
time
이 경우 구문은 셸 구문의 단어이며 info bash time
이에 대해 자세히 알아보기 위해 실행합니다.
zsh$ type ls
ls is a shell function from /home/stephane/.zshrc
ls
내 쉘 시작 파일의 함수로 재정의되었습니다. functions ls
/ typeset -f ls
또는 which ls
(약어 )를 사용하면 whence -c ls
해당 정의를 볼 수 있습니다 zsh
.
ksh$ type r
r is an alias for 'hist -s'
ksh93, zsh 또는 bash에서는 한 단계 더 나아가 키워드, 별칭, 함수, 내장 및 실행 파일(및/또는 실행 파일의 해시 테이블)에서 찾을 수 있는 모든 변형을 type -a cmd
알려줍니다 .cmd
$PATH
bash-5.2$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
zsh$ mac:~$ type -a echo
echo is a shell builtin
echo is /home/stephane/bin/echo
echo is /bin/echo
tcsh 쉘에서 which cmd
이를 사용하여 더 자세한 정보를 제공 할 수 있습니다( 이 옵션을 지원하는 type
zsh에서도 작동함 ).which
-a
파일 시스템에서 실행 파일로 발견되는 다양한 명령의 경우 다음과 같은 상황에서 여러 변형이 발견될 수 있습니다.
- 변형은 일부 타사 소프트웨어의 일부로 설치됩니다. Homebrew를 통한 macOS와 같습니다.
- 시스템은 여러 표준을 지원하며 설정을 통해 환경에서 호환되는 표준을 선택할 수 있습니다.
$PATH
Solaris에서 일부 XPG4 또는 XPG6 모듈을 설치하여 POSIX 준수(다른 버전)를 활성화할 수 있는 것과 마찬가지로 표준 실행 파일의 버전은/usr/xpg6/bin
다음과 같습니다./usr/xpg4/bin
사전에/bin
가능합니다 . 문서를 구하는 방법을 알려줄 것입니다.$PATH
man standards
- 쓰기 권한이 있는 디렉토리에 일부 변형을 직접 설치 하고
~/bin
.$PATH
- 시스템 관리자는 다음과 같은 변형을 로컬로 설치했습니다
/usr/local/bin
.
이러한 경우 관련 디렉터리에서 문서를 찾 $MANPATH
도록 업데이트되었을 수도 있습니다 . 주제에 대한 모든 매뉴얼 페이지를 불러올 수 있습니다.man
man -a
데비안과 그 파생물에서는 사용 가능한 명령의 대체 구현을 사용할 수 있습니다. 예를 들어, locate
GNU findutils나 mlocate 또는 plocate에서 명령을 가져올 수 있습니다. 여러 패키지가 설치된 경우 시스템 관리자는 명령을 실행하여 update-alternatives
기본적으로 사용되는 패키지를 선택할 수 있으며, 다른 대체 패키지는 여전히 locate.findutils
다른 이름(예:)으로 호출될 수 있으며 매뉴얼 페이지는 항상 다른 이름으로 액세스할 수 있습니다.
자세한 정보를 보려면 실행하세요 update-alternatives --display
. 예를 들어
$ update-alternatives --display locate
locate - auto mode
link best version is /usr/bin/plocate
link currently points to /usr/bin/plocate
link locate is /usr/bin/locate
slave locate.1.gz is /usr/share/man/man1/locate.1.gz
slave updatedb is /usr/bin/updatedb
slave updatedb.1.gz is /usr/share/man/man1/updatedb.1.gz
slave updatedb.8.gz is /usr/share/man/man8/updatedb.8.gz
/usr/bin/locate.findutils - priority 20
slave locate.1.gz: /usr/share/man/man1/locate.findutils.1.gz
slave updatedb: /usr/bin/updatedb.findutils
slave updatedb.1.gz: /usr/share/man/man1/updatedb.findutils.1.gz
/usr/bin/plocate - priority 90
slave locate.1.gz: /usr/share/man/man1/plocate.1.gz
slave updatedb: /usr/sbin/updatedb.plocate
slave updatedb.8.gz: /usr/share/man/man8/updatedb.plocate.8.gz