Linux выполнить команду после завершения предыдущей

Как запустить команду после того, как уже запущен, существующий завершается?

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

Так, например, если я запустил:

и нажмите enter . как я могу запустить другую команду после ее завершения?

5 ответов

Вы можете отделить несколько команд командой ; , поэтому они выполняются последовательно, например:

Если вы хотите выполнить следующую программу, только если скрипт закончил с кодом возврата 0 (что обычно означает, что он выполнен правильно), то:

Если вы хотите противоположное (т. е. продолжать только в случае сбоя текущей команды), чем:

Вы можете запустить свой сценарий в фоновом режиме (но будьте осторожны, вывод скриптов ( stdout и stderr ) будет продолжать идти на ваш терминал, если вы не перенаправите его где-нибудь), а затем wait для этого:

Если у вас есть скрипт запуска alredy, вы можете приостановить его с помощью Ctrl-Z , а затем выполнить что-то вроде:

Где fg переносит приостановленный процесс на передний план ( bg заставит его работать в backgroung, в значительной степени, как начатый с & )

Вы также можете использовать управление заданиями bash. Если вы запустили

, затем нажмите ctrl + z, чтобы приостановить его:

, чтобы перезапустить задание в фоновом режиме (как если бы он был запущен с помощью really_long_script.sh & ). Затем вы можете подождать, пока это фоновое задание с помощью

где N — это идентификатор задания (возможно, 1, если вы не запускали никаких других фоновых заданий), который также отображается как [1] выше.

Если процесс не запускается на текущем tty, тогда другой вариант будет:

Оказывается, это не так сложно: вы можете просто ввести следующую команду в окно, пока существующая работает, нажмите клавишу ввода, а когда первая завершится, вторая команда будет автоматически запускаться.

Я предполагаю, что есть более элегантные способы, но, похоже, это работает.

Редактирование, чтобы добавить, что если вы хотите запустить оповещение после завершения команды, вы можете создать эти псевдонимы в .bashrc, затем запустите alert пока он запущен:

Некоторое время назад я написал сценарий, чтобы дождаться окончания другого процесса. NOISE_CMD может быть что-то вроде notify-send . , данный что DISPLAY установлен правильно.

Без какого-либо сегмента, немедленно сделайте некоторый шум. Это поведение позволяет что-то подобное для удобства (скажем, вы называете скрипт ниже alarm.sh ):

Конечно, вы можете делать много забавных вещей с таким сценарием, например, позволить экземпляру alarm.sh ждать экземпляра alarm.sh , который ждет некоторую другую команду. Или выполнение команды сразу после завершения какой-либо задачи другого зарегистрированного пользователя . >: D

Бывшая версия сценария выше может быть интересной, если вы хотите избежать зависимости от pgrep и принять идентификаторы процесса поиска сами:

Немного не по теме, но полезно в аналогичных ситуациях: Возможно, вас заинтересует reptyr , инструмент, который «крадет» процесс из некоторой (родительской) оболочки и запускает ее из текущей оболочки. Я пробовал аналогичные реализации и reptyr является самым красивым и надежным для моих целей.

Источник

Объединения команд и обработка выходных данных в shell

Дата добавления: 07 апреля 2010

Объединение команд это очень полезная операция которую я сам очень часто применяю в терминале. Допустим вам нужно куда-то срочно уйти, но вы хотите скомпилировать что-либо. Вы знаете, что сначала нужно ввести ./configure потом make и только потом make install, при том окончание работы make иногда приходиться ждать час. В таких моментах придет объединение команд. Зная этот прием, вы введете ./configure && make && make install и уйдете по своим делам в то время как все нужные команды выполняться сами и полностью завершат компиляцию.
Можно даже добавить команду shutdown -h now в конец для отключения компьютера после выполнения всех операций.

Читайте также:  Видеоплеер для windows x64

Последовательное выполнение команд вне зависимости от исхода работы предыдущей.
Выполнить сколько угодно команд последовательно можно путем разделение команд символом ; (точка с запятой).
Пример:
./configure ; make ; make install
-выполняться все команды последовательно вне зависимости от исхода предыдущих.
То есть, если в ./configure будет выведено сообщение об ошибки, то интерпретатор все равно попробует выполнить make и make install .

Последовательное выполнение команд при условии успешного завершения предыдущих.
Символы && (два амперсанда) позволяют выполнять действие подобные предыдущей конструкции, но при не успешном завершении команды интерпретатор прекратит выполнение всего сценария.
Например:
./configure && make && make install
-если в ./configure будет ошибка, то последующие команды не будут исполняться. Если же все прошло удачно, то начнут выполняться make и make install притом если в make будет ошибка, то make install выполняться тоже не будет.

Выполнение команды, если предыдущая завершилась ошибкой.
Можно выполнить команды не только при успешном завершении предыдущей, но и при ошибочном завершении предыдущей с помощью символов || (две прямых черты).
Пример:
make install || echo ‘Ошибка!’
-выведется слово ошибка при неудачном завершении команды make install , иначе это слово выводиться не будет.

Использование выходных данных одной команды при вызове другой.
Давайте посмотрим на пример:
touch $(uname -r)
Эта команда создаст файл имя которого будет версия текущего ядра linux.
Команде touch передается с помощью конструкции $() команда выходные данные которой можно использовать для аргумента первой команды.

Источник

Выполнить команду после завершения предыдущего

Существует ли эмулятор терминала, который позволяет пользователю выполнить команду после завершения текущей?

Я ищу программное обеспечение, а не объяснение того, как объединять команды (например, через && или ; ). Просто я часто хочу что-то сделать после того, как что-то еще закончено, но не планирую все заранее. Небольшая запись контекстного меню, называемая «выполнить после завершения текущей команды», открывающая новое окно терминала, которое делает именно это, было бы здорово.

2 ответа 2

Вы можете ввести или вставить новую команду в окне оболочки, в которой выполняется текущая команда, и оболочка увидит ее и выполнит после завершения текущей команды.

Никаких дополнительных пунктов меню не требуется.

(повторное приглашение печатается , так как оболочка предложит вам после выполнения command1 перед началом command2

Обратите внимание, что если вы убьете command1 с помощью kill , то command2 выполняется сразу же, но если вы введете Ctrl-C в этой оболочке, это прервет обе команды.

Я предполагаю, что вы используете Bash CLI. Есть по крайней мере два способа сделать это, в зависимости от того, сколько вы хотите запланировать заранее.

Если вы наберете команду и введете , а затем решите, что хотите выполнить какую-то другую команду, когда это закончится, вы можете сделать это:

  • Добавлены номера строк («001 . »)
  • Строка 001: две команды выполняются последовательно из-за ; второй — длительный
  • Строка 002: немедленный вывод из «даты» в строке 001, для справки
  • Строка 003: пользователь вводит дополнительные команды, пока команда «sleep» из строки 001 все еще выполняется, ввод текста повторяется, но не интерпретируется до завершения «sleep»
  • Строка 004: появляется подсказка $, отмечающая завершение выполнения второй команды в строке 001, остаток повторяется в строке 003.
  • Строка 005: вывод команды ‘tty’, введенной в строке 003
  • Строка 006: вывод команды date введен в строке 003, сравнить со строкой 002
Читайте также:  Windows не видит iphone папка пуста

Однако, если вы заранее знаете, что захотите запустить что-то еще после первоначальной команды, но пока не знаете, что, вы можете явно подождать:

Источник

🐧 Различные способы повторить вашу последнюю команду в Linux

Привет ! Сегодня я научу вас, как повторить вашу последнюю команду в Linux.

Вам не нужно повторно вводить ранее выполненные команды в вашей командной консоли.

Конечно, мы используем клавишу со стрелкой ВВЕРХ, чтобы выбрать последние выполненные команды, и нажимаем ENTER, чтобы выполнить их.

Однако есть и другие способы сделать это.

Может быть много способов повторить последние команды в Unix-подобных системах, но это единственные способы, которые я знаю в данный момнет.

Все эти команды были протестированы на моем настольном компьютере с Linux и Ubuntu 18.04 LTS с оболочкой BASH.

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

Как повторить вашу последнюю команду в Linux

Давайте сначала запустим несколько команд.

Как я упоминал ранее, мы можем выполнить последнюю команду, просто нажав стрелку ВВЕРХ и нажав клавишу Enter.

Это наиболее распространенный способ, используемый многими пользователями для выполнения предыдущей команды.

Этот метод будет работать во всех оболочках, независимо от используемого вами дистрибутива Linux.

Однако, как я уже сказал, есть несколько других способов сделать это.

Теперь позвольте мне показать вам, как выполнить последнюю команду с некоторыми практическими примерами.

Метод 1 – Использование восклицательных знаков:

Чтобы выполнить любую последнюю выполненную команду, просто введите двойной восклицательный зна к и нажмите клавишу Enter:

Добавьте «sudo» перед «!!» чтобы выполнить последнюю команду от имени пользователя root, как показано ниже.

Эта команда также выполнит предыдущую команду:

Круто, не правда ли?

Вам не нужно вводить последнюю команду полностью.

Это может быть полезно, когда вы уже выполнили очень длинную команду и не хотите вводить эту команду полностью.

Способ 2 – повторить N-ую команду:

Возможно, вы выполнили много команд и хотите повторить определенную команду.

Что вы будете делать?

Вы можете сделать это, набрав определенное слово предыдущей команды.

Чтобы повторить предыдущую команду, которая начинается с определенного слова / буквы, например, un, просто введите:

Приведенная выше команда выполнит последнюю команду, которая начинается с букв «un».

Пример вывода для вышеуказанной команды:

Как видите в приведенном выше примере, вам не нужно вводить всю команду (т.е. uname -r).

Вместо этого просто введите несколько букв команды, и любая предыдущая команда, содержащая слова, будет выполняться.

Кроме того, если вы знаете полное имя команды, просто введите его, как показано ниже:

Система выполнит последнюю команду.

Что делать, если вы не хотите повторять последнюю команду, а просто отобразить ее.

Иногда вам не нужно запускать команду, а просто извлечь ее из истории.

Если это так, найдите префикс номера команды, которую вы хотите выполнить:

Метод 3 – Использование обратного поиска:

Другой способ сделать это – поиск в истории командной строки с помощью сочетания клавиш CTRL + R.

Нажмите клавиши CTRL + R для поиска по истории командной строки.

Я лично предпочитаю этот метод.

Он ищет историю в интерактивном режиме, что, на мой взгляд, безопаснее, чем слепое выполнение команд из истории BASH.

Посмотрите на следующий пример.

В следующем примере я искал «itsec», и система показала последнюю команду «sudo netctl restart itsecforu» в истории, которая содержала слово «itsec»

Затем я нажимаю клавишу Enter для немедленного выполнения команды или клавишу со стрелкой вправо для завершения команды и нажимаю клавишу Enter для ее выполнения.

Читайте также:  Защищенный код для windows

На всякий случай, если вы хотите отредактировать / изменить последнюю команду перед ее выполнением, просто нажмите клавишу со стрелкой влево, затем отредактируйте последнюю команду и нажмите ENTER, чтобы выполнить ее.

Некоторые команды могут начинаться с одинаковых букв.

В таких случаях продолжайте нажимать клавиши CTRL + R, чтобы вернуть команду, которую вы хотели выполнить.

Метод 4 – Используя символ дефиса с номерами префикса команды:

Вот еще один способ выполнить предыдущую команду.

Способ 5 – Использование CTRL + p и CTRL + o:

Я не хочу вводить какие-либо команды вручную.

Есть ли способ повторить последнюю команду простым нажатием определенной клавиши (клавиш) на моей клавиатуре? Да, конечно!

Нажмите CTRL + P, чтобы перейти к последней команде, а затем нажмите CTRL + O, чтобы выполнить ее.

Вы можете использовать CTRL + O столько раз, сколько вы хотите, чтобы продолжить повторное выполнение последних команд.

Способ 6 – Использование команды «fc»:

Это еще один способ повторить последнюю выполненную команду.

Команда «fc» используется для просмотра, редактирования и повторного ввода ранее введенной команды.

Чтобы повторить последнюю команду, используя fc, просто запустите:

На это пока все.

Теперь вы знаете, как повторить последнюю команду, не вводя ее в терминале.

Если вы хотите просмотреть вывод ваших последних команд без необходимости их повторного ввода, эти методы вам помогут.

Если вы знаете какие-либо другие методы, пожалуйста, дайте мне знать в разделе комментариев ниже.

Я проверю и обновлю руководство с вашими дополнениями.

Источник

Возможно ли, чтобы команды bash продолжались до результата предыдущей команды?

при выполнении команд из сценария bash bash всегда ждет завершения предыдущей команды или просто запускает команду, а затем переходит к следующей?

ie: если вы запустите следующие две команды из сценария bash, возможно ли, что что-то не удастся?

6 ответов

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

амперсанды в конце каждой из первых трех строк говорят Башу выполнить команду в фоновом режиме. Четвертая команда:—1—>, говорит bash подождать, пока все дочерние процессы не выйдут.

обратите внимание, что если вы делаете вещи таким образом, вы не сможете получить статус выхода дочерних команд (и set -e не будет работать), поэтому вы не сможете сказать, удалось ли им или не удалось обычным способом.

на руководство bash больше информации (поиск wait , примерно две трети пути вниз).

добавить ‘&’ в конце команды, чтобы запустить его параллельно. Однако это странно, потому что в вашем случае вторая команда зависит от конечного результата первой. Используйте последовательные команды или скопируйте в b и c из a следующим образом:

Если вы явно не скажете bash запустить процесс в фоновом режиме, он будет ждать, пока процесс не завершится. Поэтому, если вы напишете это:

bash будет продолжаться, не дожидаясь выхода foo. Но если вы явно не ставите процесс в фоновом режиме, bash будет ждать его выхода.

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

В общем случае, если явно не отправлены в фоновом режиме или разветвления себя как демон, команды в сценарии оболочки сериализуются.

Они ждут, пока предыдущий не будет закончен. Однако вы можете написать 2 скрипта и запустить их в отдельных процессах, чтобы они могли выполняться одновременно. Это дикая догадка, на самом деле, но я думаю, что вы получите ошибку доступа, если процесс попытается записать в файл, который читается другим процессом.

Источник

Оцените статью