2014-11-30 3 views
0

apt-get을 사용하여 자동으로 설치 될 bash 스크립트를 작성하려고합니다.apt-get은 bash에서 설치가 실패한 후 루프에서 계속 실행되지 않습니다.

방법 1 개

Install(){ 
for TempVar in "$1" 
do 
eval 'sudo apt-get install '$TempVar 
done 
} 

방법 뭔가를 설치하지 못했습니다 두 경우 모두 2

Install(){ 
eval 'sudo apt-get install '$TempVar 
} 

for TempVar in "$1" 
do 
Install '(insert programs here separated by spaces)' 
done 

apt-get을 아무것도를 설치하기를 거부 : 나는 설치를 위해 다음과 같은 방법을 사용하고 있습니다. 당연히 apt-get은 for 루프가 끝난 후 같은 스크립트에서 정상적으로 작동합니다. 나는 그것이 실행 된 루프가 완전히 종료 될 때까지 apt-get이 오류 상태를 유지한다는 인상하에있다. 이 문제를 해결할 방법이 있습니까?

+0

http://stackoverflow.com/posts/27219398/edit를 클릭하고 코드를 코드로 지정하여 코드 및 일반 텍스트를 확인하십시오. –

답변

0

모든 설치를 apt-get 명령으로 수행 했으므로 코드가 실패했다고 생각합니다. 그리고 apt-get은 하나씩 주어진 인자를 처리합니다. 따라서 인수 중 하나가 실패하면 이후의 모든 인수는 무시됩니다.

그래서, 당신의 호출 코드에서, 당신은 그것을 단지 하나 개의 인수, 즉 인용 된 문자열 'pkg1의의 pkg2에의 PK3'제공 : 함수에 다음

Install 'pkg1 pgk2 pkg3' 

을, 평가는 하나 개의 인수의 문자열을 사용하고 변 패키지 인수가 3 개인 apt-get 명령.

방금 ​​다음을 작성하고 테스트했습니다. 나는 그것이 당신이 원하는 것이라고 생각한다 :

#!/bin/bash 

function my_install() { 
    for p in "[email protected]" 
    do 
    sudo apt-get --yes install $p 
    done 
} 


# here, call: 
# my_install pkg1 pkg2 pkg3 

주목해라. 나는 내 패키지 목록 인수를 내 함수에 인용하지 않는다. 또한 참고로, for 루프에서 "$ @"를 사용합니다.

+0

감사합니다. 완벽하게 작동했습니다. –

1

두 루프 모두 apt-get을 호출 할 때마다 하나의 패키지 만 설치합니다. 각 apt-get가 별도의 명령으로 실행되고 있기 때문에 오류가 발생하면 루프를 멈추는 것이 적절하지 않습니다. bash입니다.

나는 무엇을 당신이 원하는 것은

sudo apt-get install $1 

편집 생각 : 또한, 당신은 "$ 1"을 인용한다면 당신이 원하는 것을 아마도 아닌 공간을 포함하는 하나의 긴 패키지 이름을 생성합니다. 스크립트 인수에 공백이 있으면 "$ @"(주위에 따옴표 사용)를 사용하십시오. $ @는받은 스크립트 args를 적절한 위치에 공백으로 재현합니다.

+0

사실, 그건 문제가 아닙니다. 명확히하기 위해, 설치가 실패하지 않는 한 모든 것이 잘 설치되는 것처럼 보입니다. 문제는 한 번의 설치가 실패 할 때입니다. apt-get는 루프가 종료되고 실행이 중지 될 때까지 루프가 스크립트에서 지시하는 다른 것을 설치하려고하지 않습니다. 이것은 apt-get에 영향을 미치지 않는 것처럼 보인다. –

+0

그러나, 당신은 포인트가있을 수 있습니다 : $ 1 주위에 큰 따옴표를 쓰는 것은 입력이 변수라면 필요하지 않을 수도 있습니다. –

+0

아, 잊어 버렸습니다 : 변수가 잘못 입력되었거나 더 이상 존재하지 않는 패키지를 편집하면 모든 것이 설치됩니다. 패키지 이름이 결국 바뀔 수 있기 때문에 나중에 전체 스크립트에서 문제가 발생할 수 있습니다. 그것 때문에 패키지에 의존하지 않는 스크립트의 일부가 실패하지 않습니다. –

1

다른 사람들이 이미 지적한 것처럼 인용 부호가 꺼져 있습니다. 실제로 for anything in "$1"은 항상 루프 본문을 정확히 실행하기 때문에 루프가 중복됩니다.

이는 for anything in "[email protected]"을 사용하여 해결할 수 있지만 실제로는 apprach가 잘못되었다고 생각합니다. 하나의 옵션을 추가하기 만하면됩니다.

sudo apt-get install --ignore-missing list of packages without quotes 
관련 문제