Из этой статьи вы узнаете про объединение нескольких команд в одной строке. Это бывает очень полезно при работе в терминале Linux.

Результат выполнения команды

При выполнении команды запускается процесс, он получает какие-то данные из stdin, что-то делает и выводит результат в stdout, а если что-то пошло не так, то выводит ошибку в stderr. Об этом я писал в прошлой статье.

Но при выполнении команды происходит кое-что ещё. Когда команда выполняется то результат её выполнения записывается в особую переменную – “?“. Результат выполнения может быть:

  • Успешным. Тогда в переменную “?” запишется “0“;
  • Не успешным, то есть при выполнении были ошибки. Тогда в переменную “?” запишется не ноль, а какое-нибудь другое число. Обычно это число зависит от ошибки.

Посмотреть значение этой переменной можно с помощью команды echo. Символ “$” перед именем переменной означает то что нам нужно вывести значение переменной, а не её имя:

alex@ubu-22:~$ touch test.txt

alex@ubu-22:~$ ls test.txt
test.txt

alex@ubu-22:~$ echo $?
0

alex@ubu-22:~$ ls test2.txt
ls: cannot access 'test2.txt': No such file or directory

alex@ubu-22:~$ echo $?
2

Как видно, результат выполнения первой команды равен “0“, значит все завершилось успешно. А результат выполнения второй команды равен “2“, значит в процессе её выполнения были ошибки.

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

Простое объединение команд

Если команды написать через точку с запятой “;” то они выполнятся одна за другой:

alex@ubu-22:~$ ls test.txt; echo $?
test.txt
0

Или:

alex@ubu-22:~$ echo "test1"; echo "test2"
test1
test2

Объединение команд с условием

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

Если нужно выполнить вторую команду, только если предыдущая завершилась успешно, то нужно использовать “&&“. Например:

alex@ubu-22:~$ sudo apt update && sudo apt dist-upgrade

То есть, если новые обновления нашлись, то обновить систему.

Если наоборот, нужно выполнить вторую команду, только если предыдущая завершилась с ошибкой, то нужно использовать “||“:

alex@ubu-22:~$ echo "test1" || echo "test2"
test1

Как видим, первая команда выполнилась, а вторая не стала.

Это работает таким образом. Linux стремится самым коротким путем получить верный результат (то есть “0“):

  • && — логическое “И”. Чтобы получить “0”, нужно чтобы обе команды возвращали “0”.
    • Если результат первой команды “0”, то нужно попробовать выполнить вторую команду.
    • А если результат первой команды не “0”, то вторую команду не имеет смысла выполнять.
  • || — логическое “Или”. Чтобы получить “0”, нужно чтобы хотя бы одна команда возвращала “0”.
    • Если результат первой команды “0”, то вторую нет смысла выполнять, так как уже понятно что результатом будет “0”.
    • А если результат первой команды не “0”, то стоит выполнить вторую команду, вдруг её результат станет “0”.

Вывод одной команды, как параметр для другой

Как перенаправить stdout одной команды на stdin другой, мы разобрались в прошлой статье. А как же все таки использовать stdout одной команды, как параметр для другой. Это делается вот так:

alex@ubu-22:~$ cat `ls test.txt`
1
2
3

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

Вот еще пример:

alex@ubu-22:~$ ls
apache2_2.4.52-1ubuntu4_amd64.deb  crash  crash.c  id.txt  ls-error.txt  ls-out.txt  test.txt  ync-statusq

alex@ubu-22:~$ ls | wc -w
8

alex@ubu-22:~$ echo "В каталоге `ls | wc -w` файлов"
В каталоге 8 файлов

Первая команда просто выводит список файлов в текущем каталоге.

Вторая команда перенаправляет этот список файлов утилите wc, которая с опцией -w считает сколько в этом списке слов.

Третья команда выводит то, что ей передали в параметре.

Итог

Вы узнали как в одной строке записать сразу несельской команд. Есть несколько разных методов:

  • команды записываются через точку с запятой “;“. Тогда они выполняются по очереди без каких-то условий;
  • команды разделяются с помощью двух черт “||“. Тогда вторая команда выполняется, только если первая завершилось с ошибкой;
  • ещё команды можно разделить с помощью двух амперсантов “&&“. При этом вторая команда выполнится, только если первая завершилась успешно.

Ещё я показал как stdout одной команды использовать в качестве параметра для другой. Это делается с помощью кавычек ` `.

В этой статье я все примеры выполнял на Ubuntu 22, но они также могут быть выполнены на Debian 11.


Сводка
Объединение команд в одной строке
Имя статьи
Объединение команд в одной строке
Описание
Из этой статьи вы узнаете про объединение нескольких команд в одной строке. Это бывает очень полезно при работе в терминале Linux

Добавить комментарий

Ваш адрес email не будет опубликован.