Объединение команд в одной строке
Результат выполнения команды
При выполнении команды запускается процесс, он получает какие-то данные из stdin, что-то делает и выводит результат в stdout, а если что-то пошло не так, то выводит ошибку в stderr. Об этом я писал в этой статье .
Но при выполнении команды происходит кое-что ещё. Когда команда выполняется то результат её выполнения записывается в особую переменную — ?. Результат выполнения может быть:
- Успешным. Тогда в переменную запишется
0; - Не успешным, то есть при выполнении были ошибки. Тогда в переменную запишется не ноль, а какое-нибудь другое число. Это число зависит от ошибки.
Посмотреть значение этой переменной можно с помощью команды echo. Символ $ перед именем переменной означает то что нам нужно вывести значение переменной, а не её имя:
$ touch test.txt
$ ls test.txt
test.txt
$ echo $?
0
$ ls test2.txt
ls: cannot access 'test2.txt': No such file or directory
$ echo $?
2
- Результат выполнения первой команды равен
0, значит все завершилось успешно. А результат выполнения второй команды равен2, значит в процессе её выполнения были ошибки.
Хоть эта информация не про объединение команд в одной строке, но иногда от результата выполнения предыдущей команды зависит выполнение следующей команды. Об этом вы прочитаете ниже.
Простое объединение команд
Если команды написать через точку с запятой ; то они выполнятся одна за другой:
$ ls test.txt; echo $?
test.txt
0
Или:
$ echo "test1"; echo "test2"
test1
test2
Объединение команд с условием
Можно выполнить объединение команд таким способом, что выполнение второй команды будет зависеть от результата выполнения предыдущей.
Если нужно выполнить вторую команду, только если предыдущая завершилась успешно, то нужно использовать &&.
$ sudo apt update && sudo apt dist-upgrade
- Если новые обновления нашлись, то обновить систему.
Если наоборот, нужно выполнить вторую команду, только если предыдущая завершилась с ошибкой, то нужно использовать ||:
$ echo "test1" || echo "test2"
test1
- Первая команда выполнилась, а вторая не стала.
Это работает таким образом. Linux стремится самым коротким путем получить верный результат (то есть 0):
&&— логическое «И». Чтобы получить0, нужно чтобы обе команды возвращали0.- Если результат первой команды
0, то нужно попробовать выполнить вторую команду. - А если результат первой команды не
0, то вторую команду не имеет смысла выполнять.
- Если результат первой команды
||— логическое «Или». Чтобы получить0, нужно чтобы хотя бы одна команда возвращала0.- Если результат первой команды
0, то вторую нет смысла выполнять, так как уже понятно что результатом будет0. - А если результат первой команды не
0, то стоит выполнить вторую команду, вдруг её результат станет0.
- Если результат первой команды
Вывод одной команды, как параметр для другой
Как перенаправить stdout одной команды на stdin другой, мы разобрались в этой статье . А как же все таки использовать stdout одной команды, как параметр для другой. Это делается вот так:
$ cat `ls test.txt`
1
2
3
- Вторую команду вписывают в такие кавычки.
Вот еще пример:
$ ls
apache2_2.4.52-1ubuntu4_amd64.deb crash crash.c id.txt ls-error.txt ls-out.txt test.txt ync-statusq
$ ls | wc -w
8
$ echo "В каталоге `ls | wc -w` файлов"
В каталоге 8 файлов
- Первая команда просто выводит список файлов в текущем каталоге.
- Вторая команда перенаправляет этот список файлов утилите wc, которая с опцией -w считает сколько в этом списке слов.
- Третья команда выводит то, что ей передали в параметре.
Если понравилась статья, подпишись на мой канал в VK или Telegram .