В Linux (и в большинстве других Unix-подобных операционных системах) есть несколько способов выполнить несколько команд в одной строке терминала. Каждый способ имеет немного разное поведение:
1. Последовательное выполнение (с помощью ;)
- Команды выполняются последовательно, одна за другой, независимо от успеха или неудачи предыдущей команды. Синтаксис: команда1 ; команда2 ; команда3 Пример:
· mkdir mydir ; cd mydir ; touch myfile. txt
Эта команда создаст директорию mydir, затем перейдет в эту директорию, а затем создаст файл myfile. txt. Даже если mkdir mydir не удастся (например, если директория уже существует), cd mydir и touch myfile. txt все равно будут выполнены.
2. Условное выполнение (с помощью &&)
- Следующая команда выполняется только в том случае, если предыдущая команда успешно завершилась (т. е. вернула код выхода 0). Синтаксис: команда1 && команда2 && команда3 Пример:
· mkdir mydir && cd mydir && touch myfile. txt
Эта команда создаст директорию mydir, и только если mkdir mydir успешно завершится, выполнится cd mydir. Если cd mydir успешно завершится, выполнится touch myfile. txt. Если любая из команд завершится неудачно, последующие команды не будут выполнены. Это полезно для предотвращения ошибок, если команды зависят друг от друга.
3. Условное выполнение (с помощью ||)
- Следующая команда выполняется только в том случае, если предыдущая команда завершилась неудачно (т. е. вернула ненулевой код выхода). Обычно используется для обработки ошибок. Синтаксис: команда1 || команда2 Пример:
· mkdir mydir || echo "Не удалось создать директорию"
Эта команда попытается создать директорию mydir. Если mkdir mydir завершится неудачно (например, если директория уже существует), будет выведено сообщение “Не удалось создать директорию”.
4. Группировка команд (с помощью ())
- Позволяет сгруппировать несколько команд и выполнить их в отдельном подпроцессе (subshell). Влияние на текущую оболочку ограничено. Синтаксис: (команда1 ; команда2 ; команда3) Пример:
· (cd /tmp ; touch myfile. txt)
Эта команда создаст файл myfile. txt в директории /tmp, но текущая рабочая директория оболочки останется неизменной. Изменение рабочей директории (cd /tmp) происходит только внутри подпроцесса.
5. Группировка команд (с помощью {})
- Позволяет сгруппировать несколько команд и выполнить их в текущей оболочке. Влияние на текущую оболочку. Требуется пробел после открывающей скобки и перед закрывающей скобкой. Синтаксис: { команда1 ; команда2 ; команда3 ;} Пример:
· { cd /tmp ; touch myfile. txt ; }
Эта команда создаст файл myfile. txt в директории /tmp, и текущая рабочая директория оболочки будет изменена на /tmp.
6. Передача вывода одной команды другой (с помощью |)
- Передает стандартный вывод одной команды на стандартный ввод другой команды (конвейер). Синтаксис: команда1 | команда2 | команда3 Пример:
· ls — l /etc | grep "conf" | wc — l
Эта команда выводит список файлов в директории /etc, затем фильтрует строки, содержащие “conf”, а затем подсчитывает количество строк.
Примеры использования:
- Создать директорию, перейти в нее, создать файл и вывести сообщение об успехе:
· mkdir mydir && cd mydir && touch myfile. txt && echo "Все прошло успешно"
- Попытаться удалить файл, и если не удалось, вывести сообщение об ошибке:
· rm myfile. txt || echo "Не удалось удалить файл"
- Выполнить команду и записать ее вывод в файл:
· ls — l /etc > filelist. txt
- Получить список процессов, отсортировать их по использованию CPU и вывести первые 10 строк:
· ps aux | sort — nrk 3,3 | head — n 10
Когда какой способ использовать?
- ;: Когда нужно выполнить все команды независимо от результата. &&: Когда нужно выполнить команды последовательно и только при успехе предыдущей. Для логической цепочки, где важен успех каждого шага. ||: Когда нужно выполнить альтернативное действие в случае неудачи. Для обработки ошибок. (): Когда нужно выполнить несколько команд в отдельном контексте и не влиять на текущую оболочку. {}: Когда нужно выполнить несколько команд в текущей оболочке и сохранить изменения (например, изменение рабочей директории). |: Когда нужно передать данные между командами для обработки (конвейер).
Понимание этих различных способов выполнения команд в одной строке значительно повышает эффективность работы в командной строке Linux. Выбирайте способ, который лучше всего соответствует логике вашей задачи.