Я сохраняю некоторые фрагменты bash и копирую и вставляю их, когда мне нужно управление. Но я обнаружил, что apt-get
отменяет выполнение скрипта. Вот мой сценарий, где проблематично.
apt-get -y install gcc g++ make cmake perl
cd ~/
mkdir t1
cd t1
Я копирую & amp; вставьте этот скрипт в OS X Terminal на сервер 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
, и как заставить его продолжить?
У меня была та же проблема, но я не был очень доволен решениями здесь, или решения не работали для меня. Что я обнаружил, чтобы запустить его, так это отправить NULL-вход в apt-get, чтобы он продолжал работать.
Это выглядит так:
apt-get -y install gcc g++ make cmake perl < "/dev/null"
cd ~/
mkdir t1
cd t1
#newline
Надеюсь, что другие люди могут использовать это тоже! Не забывайте перевод строки, чтобы последняя команда также была выполнена
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
завершит работу с ненулевым кодом - так что внешний скрипт выйдет из каскада - но этого не произошло, и выполнение продолжилось.
Во-первых, вы не запускаете скрипт. Вставка серии команд не создает сценарий. Как описано в ответе Джобина, у вас не было бы этой проблемы, если бы вы на самом деле использовали скрипт.
Проблема, вероятно, в том, что вы перегружаете входной буфер командами и надеетесь, что bash - следующий процесс, который читает из входного буфера. Есть много причин, по которым apt-get вместо этого будет читать из входного буфера, поэтому ничего не останется, когда он завершит работу и вернет вас обратно в bash.
Если хотите, вы все равно можете вставить серию команд, не копируя и не записывая файл сценария и не делая его исполняемым. (Во многих случаях создание сценария было бы пустой тратой усилий, например, простым набором команд, которые вы должны выполнять на нескольких компьютерах и никогда дважды на одной машине.)
Если вы вставите серию Команды, разделенные точкой с запятой, вся последовательность передается в bash и будет продолжаться независимо от того, что apt делает с входным буфером:
apt-get -y install gcc g++ make cmake perl; cd ~/; mkdir t1; cd t1
Вы не должны копировать-вставлять команды в сценарии на терминале, сценарий должен выполняться на терминале. Проблема с первым подходом состоит в том, что, как только первая команда будет вставлена вместе с новой строкой в конце, начинается выполнение 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
.