특정 라이브러리가 VPS에 설치되어 있는지 테스트하고 그렇지 않은 경우 스크립트가 해당 라이브러리를 설치하는 데 필요한 bash 스크립트를 작성 중입니다.
내 문제는 스크립트가 존재하는지 확인하도록 할 수 있다는 것입니다. 내 주요 아이디어는 이것을 사용하는 것입니다.
ldd /usr/lib/libgd.so > /tmp/lddcheck 2>/dev/null
ldd 결과를 파일로 출력한 다음 grep 등을 사용하여 내가 찾고 있는 라이브러리를 검색할 수 있습니다. 존재하지 않으면 설치하고 그렇지 않으면 스크립트가 계속됩니다.
정확히 무엇을 해야할지 잘 모르겠습니다. 어떤 도움이라도 대단히 감사하겠습니다(bash 스크립팅에 상당히 새로운 기능입니다).
답변1
당신을 보면~ 할 것이다일종의 패키지 관리자를 사용하여 라이브러리를 설치하고 필요한 패키지 목록만 만드는 것이 더 쉽지 않을까요?생각하다설치하고 어떻게 든 설치되었는지 확인하려면?
내가 아는 한, 패키지 관리자의 100%에는 패키지가 설치되지 않은 경우 설치하고, 설치되었지만 오래된 경우 최신 버전으로 업데이트하고, 이미 설치된 경우 최신 버전으로 업데이트하는 일부 모드(일반적으로 기본값)가 있습니다. 최신인 경우 직접 전달됩니다.
예를 들어 패키지 , , 가 설치되어 있는지 apt-get
항상 확인할 수 있습니다 . 등등 .apt-get install a b c d ...
a
b
c
d
yum
yum install a b c d
VPS에서 다양한 패키지 관리자와 함께 다양한 시스템을 사용하는 경우 어떤 패키지 관리자를 사용하는지 감지하는 로직을 작성하게 되므로 이 단계는 불가피합니다.
답변2
제안된 대로 ldd 명령을 실행한 후 다음과 같은 명령을 시도해 볼 수 있습니다.
grep "not found" /tmp/lddcheck | awk '// { print $1 }'
누락된 라이브러리의 이름을 가져옵니다.
답변3
필요한 라이브러리가 이를 지원한다고 가정하면 이를 사용해야 합니다. pkg-config
그게 바로 그 목적입니다.
$ pkg-config --exists libnotify
$ echo $?
0
$ pkg-config --exists nonexistant
$ echo $?
1
$
이를 사용하여 버전을 확인하고 포함 또는 라이브러리 경로 등을 알릴 수 있습니다.
답변4
스크립팅을 처음 사용하는 경우 다음 사항을 기억하십시오. 임시 파일이 거의 필요하지 않으며 임시 파일도 거의 필요하지 않습니다. 여러 단계에서 일부 데이터를 처리해야 하는 경우 파이프라인을 사용합니다. 출력 시 다양한 텍스트 처리 도구를 사용할 수 있습니다 ldd
. 여기서는 ,를 사용하여 (라이브러리 경로 대신) awk
세 번째 공백으로 구분된 필드가 있는 줄을 감지 하고 첫 번째 필드(라이브러리 이름)를 인쇄합니다. not
누락된 라이브러리의 공백으로 구분된 목록을 포함하는 변수로 출력을 수집했습니다.
missing=$(ldd /path/to/executable | awk '$3 == "not" {print $1}')
for x in $missing; do
# whatever it takes to install $x
done
이는 올바른 접근 방식이 아닐 수도 있습니다. 특정 배포판을 지원하려면 패키지 관리자와의 사용자 정의 상호 작용이 포함된 범용 바이너리 패키지를 만들지 마세요.이 배포판에 대한 패키지를 배포하십시오.
패키지 관리자는 시스템 관리자의 업무를 더 쉽게 만들어줍니다. 패키지 관리자를 제대로 사용하지 못하면 사용자가 혼란을 느끼고 분노할 수 있습니다. rpm 및 deb 등을 배포하는 경우 사용자는 패키지의 종속성만 설치하면 됩니다. 이렇게 하면 일부 위험한 스크립트를 실행하는 대신 사용자에게 익숙한 패키지 관리 도구를 사용하여 패키지가 기록되고 설치, 업그레이드 및 제거될 수 있습니다.