Bash и скрипты
Редактировать на GitHub$@ в bash?Что делает set -euo pipefail?Как включить debug-режим (set -x)?Как остановить выполнение при ошибке?В bash-скрипте указан аттрибут оболочки set -x. В одной из команд происходит ошибка и скрипт завершает свою работу. Как сделать, чтобы при возникновении ошибки в определенной команде скрипт продолжил свою работу?Как выполнить фильтрацию вывода команды, чтобы на экран были выведены только ошибки (STDERR), игнорируя STDOUT?Практические вопросыПроведите ревью bash-скриптаТеоретические вопросы
Что значит $@ в bash?
$@ - все параметры переданные скрипту.
Что делает set -euo pipefail?
Команда set устанавливает аттрибуты оболочки с опеределенных опций.
Опция -e - означает, что скрипт будет остановлен, когда произойдет ошибка в ходе его выполнения.
Опция -u - означает, что скрипт будет остановлен, если в ходе скрипта, будет обнаружена переменная, которая не определена.
Опция -o pipefail - означает, что скрипт будет остановлен, если в ходе пайплайна команд будет выявлена ошибка.
Как включить debug-режим (set -x)?
Команда set -x в начале скрипта активирует вывод в консоль debug информации.
Как остановить выполнение при ошибке?
Команда set -e завершит скрипт с ошибкой, в случае, если в нижеследующем bash коде будет обнаружена ошибка. По-умолчанию bash скрипт продолжает работу, если в ходе выполнения возникла ошибка.
В bash-скрипте указан аттрибут оболочки set -x. В одной из команд происходит ошибка и скрипт завершает свою работу. Как сделать, чтобы при возникновении ошибки в определенной команде скрипт продолжил свою работу?
1 вариант: указать || true после выполнения команды с ошибкой.
<command with error> || true2 вариант: до выполнения данной команды указать set +e для игнорирования ошибок, начиная со следующей строки и после выполнения команды указать set -e для завершения работы скрипта в случае ошибки, начиная со следующей строки.
set -e
<command 1>
<command 2>
set +e
<command 3 wih error>
set -eКак выполнить фильтрацию вывода команды, чтобы на экран были выведены только ошибки (STDERR), игнорируя STDOUT?
Для этого нужно перенаправить стандартный вывод (STDOUT) в «никуда», а стандартный поток ошибок (STDERR) оставить:
command > /dev/nullВ этом случае на экран попадут только ошибки (STDERR).
Практические вопросы
Проведите ревью bash-скрипта
Оригинальный скрипт:
#!/bin/bash
file=$1
if [ -f $file ]
then
echo "File exists"
else
echo "File does not exist"
fiОшибки и улучшения:
- Нужны кавычки вокруг переменной:
[ -f "$file" ](иначе сломается с пробелами). - Проверка на пустой аргумент (
[ -z "$file" ]). - Для читаемости
thenпишут в одну строку сif.
Исправленный вариант:
#!/bin/bash
file=$1
if [ -z "$file" ]; then
echo "Usage: $0 <filename>"
exit 1
fi
if [ -f "$file" ]; then
echo "File exists"
else
echo "File does not exist"
fiПоследнее обновление: 3 окт. 2025 г., 14:29:20