저는 Debian/Ubuntu에 여러 패키지가 설치되어 있는지 확인하고 싶습니다. 이를 위해 사용하려는 스크립트는 다음과 같습니다.
query=`dpkg-query -W -f '${Status}'`
ok="install ok"
if ! [ `$query` curl == "$ok" ] ;then
apt-get -y -qq install curl >> /dev/null 2>&1
fi
밝혀지다
Install: target Installed is not a directory
하지만 이는 두 번째 변수에서 볼 수 있는 것과 같아야 합니다. 이 문제를 처리할 올바른 방법을 찾을 수 없어서 머리가 아프네요.
답변1
불필요하게 복잡한 방식으로 일을 하고 있는 것 같습니다. 왜 안되지?
dpkg -l curl || apt-get -y -qq install curl > /dev/null 2>&1
결국 당신은 농담을 요청했습니다. 아마도 당신이 원하는 것은 그것이 사용 가능한지 아는 것이므로 curl
이 작업도 수행할 수 있습니다.
type curl >/dev/null 2>&1 || apt-get -y -qq install curl
답변2
코드에는 두 가지 버그가 있습니다. 하나는 심각하고 하나는 덜 심각합니다.
백틱을 두 번 사용했습니다. 백틱도 사용하지 마세요. 다음과 같이 명령 대체를 사용하십시오.
$(command ...)
query=$(dpkg-query -W -f '${Status}')
쿼리에는 이미 명령 호출 결과가 포함되어 있습니다. 지금 실행하면
`$query`
이제 결과를 실행하려고 시도할 것입니다. 귀하의 경우에는 문자열입니다. 저에게는 다음을 포함하는 매우 긴 문자열이었습니다.
install ok installedinstall ok installed...
(Costas가 이것을 지적했습니다.) 의지의 결론
dpkg-query -W -f '${Status}' curl
은install ok installed
이것이 당신이 확인하는 것이 아니라는 것입니다.
답변3
패키지가 설치되어 있는지 확인하고 그렇지 않으면 설치하는 것은 의미가 없습니다. 누구나:
- 컬 바이너리와 같이 패키지에 원하는 것이 있는지 확인할 수 있으므로
command -v curl
사용자는 필요한 경우 대안을 제공할 수 있습니다. - 다음과 같은 것을 사용할 수 있습니다
apt-cache policy
.
이러한 조건 중 어느 것도 적용되지 않으면 직접 설치가 더 간단합니다.