apt-get 이후 스크립트가 중지되지 않도록 방지하는 방법은 무엇입니까?

apt-get 이후 스크립트가 중지되지 않도록 방지하는 방법은 무엇입니까?

일부 bash 조각을 보관하고 관리가 필요할 때 복사하여 붙여넣습니다. 하지만 apt-get스크립트 실행이 취소된다는 사실을 발견했습니다 . 문제가 있는 스크립트는 다음과 같습니다.

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

OS X 터미널에서 이 스크립트를 복사하여 Ubuntu 12.04 LTS 서버에 붙여넣습니다(VM에 새로 설치) 스크립트는 apt-get완료되면 항상 중지됩니다.

나는 root이와 같은 계정으로 이 명령을 실행합니다.

ssh user1@server

<password…>

sudo su

<password…>

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

이것이 문제가 될 수 있습니까? 아니면 스크립트가 apt-get완료된 후 중지되는 이유는 무엇이며 계속되도록 만드는 방법은 무엇입니까?

답변1

나는 같은 문제가 있었지만 여기의 솔루션이 별로 만족스럽지 않았거나 솔루션이 나에게 효과가 없었습니다. 내가 그것을 실행하기 위해 알아낸 것은 apt-get에 NULL 입력을 보내서 계속 작동하도록 하는 것입니다.

다음과 같습니다:

apt-get -y install gcc g++ make cmake perl  < "/dev/null"

cd ~/
mkdir t1
cd t1

#newline

다른 사람들도 이것을 사용할 수 있기를 바랍니다! 마지막 명령도 실행되도록 개행 문자를 잊지 마세요.

답변2

우선, 스크립트를 실행하고 있지 않습니다. 일련의 명령을 붙여넣어도 스크립트가 생성되지 않습니다. Jobin의 답변에 설명된 대로 실제로 스크립트를 사용하는 경우에는 이 문제가 발생하지 않습니다.

문제는 아마도 명령으로 입력 버퍼를 오버로드하고 bash가 입력 버퍼에서 읽을 다음 프로세스가 되기를 바라는 것입니다. 대신 apt-get이 입력 버퍼에서 읽는 데에는 많은 이유가 있으므로 완료되면 아무것도 남지 않고 bash로 돌아갑니다.

원하는 경우 스크립트 파일을 복사하거나 작성하고 실행 가능하게 만드는 수고를 겪지 않고도 일련의 명령을 붙여넣을 수 있습니다. (대부분의 경우 스크립트를 작성하는 것은 노력 낭비입니다. 예를 들어 여러 시스템에서 수행해야 하고 동일한 시스템에서 두 번 수행하지 않아야 하는 간단한 명령 세트가 있습니다.)

세미콜론으로 구분된 일련의 명령을 붙여넣으면 전체 시퀀스가 ​​bash에 공급되고 apt가 입력 버퍼에서 수행하는 작업에 관계없이 계속됩니다.

apt-get -y install gcc g++ make cmake perl; cd ~/; mkdir t1; cd t1

답변3

터미널의 스크립트에 있는 명령을 복사하여 붙여넣어서는 안 되며, 스크립트는 터미널에서 실행되어야 합니다. 첫 번째 접근 방식의 문제점은 첫 번째 명령이 끝에 줄 바꿈과 함께 붙여넣자마자 apt-get이 실행을 시작하여 추가 명령이 터미널에 붙여넣어지지 않도록 방지한다는 것입니다. 실행.

스크립트를 실행하려면 다음과 같이 파일 run.sh(또는 원하는 이름)에 명령을 작성하십시오.

#!/bin/bash
apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

그런 다음 터미널에서 실행하려면 bash run.shor를 입력하세요 bash filename(파일 이름을 스크립트에 지정한 이름으로 바꾸세요). 이 스크립트의 첫 번째 줄은 스크립트를 직접 실행한 다음(먼저 를 사용하여 실행 가능하게 만들고 chmod +x filename) 스크립트를 /path/filename.

답변4

apt-get성공적으로 설치되었음에도 불구하고 0이 아닌 코드로 종료되는 경우가 있습니다.

그러면 스크립트가 중단됩니다. 이것은 말도 안되고 우스꽝스러운 일이지만 이 문제를 해결해야 합니다. 종료 코드가 무시되도록 apt-get 블록을 하위 스크립트로 래핑하여 강제로 계속 진행하려고 했습니다.

set -e

bash << +END
apt-get -y install gcc g++ make cmake perl
exit 0
+END
echo $?

cd ~/
mkdir t1
cd t1

실제로 나는 내부가 bash0이 아닌 코드로 종료될 것이라고 예상했습니다. 그래서 외부 스크립트가 캐스케이드를 종료할 것입니다. 그러나 그렇지 않았고 실행이 계속되었습니다.

관련 정보