Как сделать так, чтобы скрипт не останавливался после 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 (свежая установка на виртуальной машине). Скрипт всегда останавливается после 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

У меня была та же проблема, но я не был очень доволен решениями здесь или решения не работали для меня. Я обнаружил, что для запуска нужно отправить NULL-вход в apt-get, чтобы он продолжал работать.

Выглядит это так:

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

cd ~/
mkdir t1
cd t1

#newline

Надеюсь, что и другие люди смогут это использовать! Не забудьте про новую строку, чтобы последняя команда тоже была выполнена

решение2

Во-первых, вы не запускаете скрипт. Вставка серии команд не создает скрипт. Как описано в ответе Джобина, у вас не было бы этой проблемы, если бы вы действительно использовали скрипт.

Проблема, вероятно, в том, что вы перегружаете буфер ввода командами и надеетесь, что 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.shили bash filename(замените filename на имя, которое вы дали скрипту). Первая строка этого скрипта сообщает, какую оболочку использовать в случае, если вы напрямую запускаете скрипт (сначала сделав его исполняемым с помощью ), chmod +x filenameа затем запускаете скрипт как /path/filename.

решение4

apt-getиногда завершается с ненулевым кодом, даже если установка прошла успешно.

И это останавливает скрипт. Это чепуха и смешно, но мне нужно обойти это. Я попытался заставить его продолжить, обернув блок apt-get в sub-script, чтобы код выхода игнорировался.

set -e

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

cd ~/
mkdir t1
cd t1

На самом деле я ожидал, что внутренний скрипт bashзавершит работу с ненулевым кодом, поэтому внешний скрипт завершит каскад, но этого не произошло, и выполнение продолжилось.

Связанный контент