Как сделать так, чтобы скрипт не останавливался после apt-get?

len() O (1) операция для списков Python, строк, dicts, и наборов. Python внутренне отслеживает число элементов в этих контейнерах.

JavaScript имеет подобное понятие truthy/falsy.

2
задан 21.04.2020, 01:23

4 ответа

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

Проблема, вероятно, в том, что вы перегружаете входной буфер командами и надеетесь, что bash - следующий процесс, который читает из входного буфера. Есть много причин, по которым apt-get вместо этого будет читать из входного буфера, поэтому ничего не останется, когда он завершит работу и вернет вас обратно в bash.

Если хотите, вы все равно можете вставить серию команд, не копируя и не записывая файл сценария и не делая его исполняемым. (Во многих случаях создание сценария было бы пустой тратой усилий, например, простым набором команд, которые вы должны выполнять на нескольких компьютерах и никогда дважды на одной машине.)

Если вы вставите серию Команды, разделенные точкой с запятой, вся последовательность передается в bash и будет продолжаться независимо от того, что apt делает с входным буфером:

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

3
ответ дан 21.04.2020, 01:24

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

Это выглядит так:

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

cd ~/
mkdir t1
cd t1

#newline

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

8
ответ дан 21.04.2020, 01:23
  • 1
    Это помогло мне так. Попытка состояла в том, чтобы создать сценарий оболочки сути, чтобы установить и установить общие программы и параметры среды, которые я мог передать по каналу в удар. Это продолжало повторять команды после apt-get isntall и я couldn' t выясняют почему.Спасибо! – T.J. Schuck 21.04.2020, 01:24

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

2
ответ дан 21.04.2020, 01:24

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

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

set -e

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

cd ~/
mkdir t1
cd t1

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

0
ответ дан 21.04.2020, 01:25
  • 1
    @StevenKath, который я хочу, чтобы мой сценарий продолжил только, когда все пакеты готовы. Так или иначе это было лучшим, я мог выяснить. – MrMesees 21.04.2020, 01:26
  • 2
    Таким образом, это продолжится только, когда склонный - доберутся, завершено. || true использование удар || оператор (только выполняет следующее, если предыдущий код выхода был ненулевым), сопровождаемый true (выход с кодом 0). Вместе, они просто превращают ненулевой код выхода в нуль (успех) код выхода. – Eponymous 21.04.2020, 01:26
  • 3
    Если you' ре с помощью set -e и Вы хотите проигнорировать код выхода для одной команды, it' s намного более простой использовать форму apt-get -y install gcc g++ make cmake perl || true – James McMahon 21.04.2020, 01:26

Теги

Похожие вопросы