Interview Questions
Linux

Bash и скрипты

Редактировать на GitHub

Теоретические вопросы

Что значит $@ в 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> || true

2 вариант: до выполнения данной команды указать 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

Ошибки и улучшения:

  1. Нужны кавычки вокруг переменной: [ -f "$file" ] (иначе сломается с пробелами).
  2. Проверка на пустой аргумент ([ -z "$file" ]).
  3. Для читаемости 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