Bash 스크립트에서 명령 버전을 얻는 방법

Bash 스크립트에서 명령 버전을 얻는 방법

따라서 질문에서 알 수 있듯이 터미널을 사용하는 대신 bash 스크립트에서 명령 버전을 얻고 싶습니다.

사용 가능한 모든 명령이 디렉터리에 파일로 존재한다는 것을 알고 있습니다./usr/빈. 그러나 버전은 제공하지 않으며 cat을 (명령) 파일 중 하나로 사용할 때 몇 가지 흥미로운 정보를 제공합니다.

예를 들어 cat /usr/bin/man-주어진-

흥미로운 결과

이것은 무엇이며 버전을 얻는 방법은 무엇입니까?

우분투 20.04를 사용하고 있습니다.

여기에 물어보는 것이 어리석은 질문이라는 것을 알지만 아무것도 찾을 수 없습니다. :/

아마도 최종 편집 - 허용된 답변이 저에게 효과적이었고 이 기능을 사용하고 있습니다.

나중에 나는 비슷한 일이 foo --version효과가 있다는 것을 깨달았습니다.

그러나 버전을 저장하기 위해 변수를 사용하는 경우 구문에 주의해야 합니다. 제가 한 일은 잘못되었습니다. 이것이 작동한다는 점을 지적한 @Romeo Ninov에게 감사드립니다
foo --version.

이런 어리석은 실수를 해서 정말 죄송합니다.

답변1

Debian 기반 배포판을 사용하는 경우 패키지 관리자를 사용하여 이 문제를 해결할 수 있습니다.

$ dpkg -S '*bin/man'
man-db: /usr/bin/man

이것은 우리 man-db가 그것을 가지고 있음을 말해줍니다 /usr/bin/man.

$ dpkg -l man-db
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  man-db         2.10.2-1     amd64        tools for reading manual pages

man-db그런 다음 어떤 버전이 설치되었는지 물었습니다 . 이는 배포 완료를 나타내는 추가 패치가 포함된 man-db배포 릴리스의 업스트림 버전입니다 . 여기에는 빌드 규칙만 포함될 수 있지만 이후 버전에서 이식된 수정 사항도 포함될 수 있습니다.2.10.2-1-12.10.2

dpkg-query추출 버전에 사용 가능:

$ dpkg-query -W -f '${Version}\n' man-db
2.10.2-1

이 모든 것을 종합하면 다음과 같습니다.

$ dpkg-query -W -f '${Version}\n' $(dpkg -S '*bin/man' | cut -d: -f1)
2.10.2-1

또는 입력할 수 있는 기능 .bashrc:

ver() {
  package=$(dpkg -S "*bin/$1" | cut -d: -f1)
  version=$(dpkg-query -W -f '${Version}' "$package")
  printf "%s\n" "$version"
}

ver man
2.10.2-1

(뒤에는 dpkg -S이지만 dpkg-query -S, dpkg-query -S와 합칠 수는 없습니다 -W -f.)

답변2

AFAIK에는 임의의 명령에서 버전을 가져오는 고정된 단일 방법이 없습니다 foo(실행하거나 실행 파일을 분석하여). 어떤 사람은 , , , ... foo에 대해 말할 수도 있고 foo -v, 다른 사람은 , , , ... 에 대해 말할 수도 있습니다 foo -V.foo --versionfoo --helpfoo -h

man foo도구가 어떤 옵션을 지원하는지 알아보려면 설명서( )를 읽어보세요 . 매뉴얼 자체에서 버전을 알려줄 수 있지만(보통 맨 아래 또는 그 근처), 이 경우에는 매뉴얼에서 설명하는 버전이지 반드시 foo사용할 수 있는 버전은 아닙니다. foo도구와 설명서가 저장소에서 설치된 시스템에서는 일치해야 하지만 일반적으로 foo설명서에 설명된 것과 다른 버전(또는 여러 버전)을 구하여 사용할 수 있습니다.

배포판에서 사용하는 패키지 시스템은 설치된 패키지 버전(Debian 및 그 파생 제품(Ubuntu 포함)의 예). 사용하려는 도구가 어떤 패키지에 속하는지 알고 있는 경우(다시 말하지만, 데비안과...), 도구 버전은 일반적으로 패키지 버전에서 추론할 수 있습니다.

일반적으로 실행 파일은 바이너리 형식일 수도 있고 아닐 수도 있습니다. 이는 모든 인터프리터를 위한 스크립트일 수 있습니다. 파일의 어느 곳에나 해당 버전을 포함하거나 출력에 보고할 필요는 없습니다. 어떤 경우에는 버전의 전체 개념이 적용되지 않습니다. 예를 들어 내 스크립트는이 다른 답변할당된 버전이 없습니다. 마찬가지로 이 래퍼를 분석했습니다.또 다른 답이 있다버전이 없습니다(버전이 있는 패키지와 함께 제공되지만).

foo -V결론은 특정 실행 파일이 아니고 스크립트를 이에 맞게 조정하지 않는 한 실행 파일 자체에서 임의의 실행 파일 버전을 안정적으로 얻을 수 없다는 것입니다.이 특정 실행 파일에 대한 올바른 내용은 무엇입니까?). 패키지 버전을 얻을 수 있습니다.

나는 볼 수 있다이 답변은 동시에 작성되었습니다.특정 실행 파일을 소유한 패키지 버전을 가져오는 방법을 제공합니다. 그러면 나는 그것을 재발명하지 않을 것입니다.

답변3

명령 버전을 얻는 일반적인 방법은 다음과 같은 명령을 사용하는 것입니다.

man --version

이렇게 하면 여러 줄의 답변이 나올 수 있으므로 이를 관리해야 합니다. 또한 각 명령에 대해 man페이지를 검사할 수 있습니다. 예를 들어:

man man

마침내 버전을 볼 수 있습니다. 바이너리에서 직접 가져오려면 다음을 사용해 보십시오.

strings /usr/bin/man

결과를 필터링하고

관련 정보