
Linux викторина №36-40: что делает команда/скрипт на изображении?
Полученные результаты

#1. Какой код возврата (rc) будет в результате выполнения команды на изображении?
Команда:
echo "Все хорошо, но..." && { false && true; }
Описание:
- echo “Все хорошо, но…”
-
echo
всегда успешно выполняется, его код возврата ($?
) равен0
. -
Так как используется
&&
, выполнение продолжается.
-
-
{ false && true; } (группировка команд в {})
-
false
всегда возвращает1
. -
&&
выполняет правую часть (true
) только если левая (false
) успешна, но так какfalse
завершилось с ошибкой,true
вообще не выполняется. -
Код возврата группы
{ false && true; }
будет1
.
-
-
Возвращаемый код всей команды
-
Так как
&&
требует успешного выполнения всех частей, а{ false && true; }
вернуло1
, итоговый код возврата всей строки будет1
.
-

#2. Какой будет результат команды Bash на изображении выше?
Команда:
for file in *; do [ -f $file ] && echo * > $file; done
Описание:
Служебный символ *
разворачивается в список имён файлов/папок в текущей директории.
-
for file in *
– берёт каждый файл/папку в текущей директории; -
[ -f $file ]
– проверяет, что это файл (не папка); -
echo * > $file
– записывает в него имена всех файлов через пробел;
В итоге все файлы будут содержать одинаковый текст – список файлов текущей папки.

#3. Что выведет echo в последней команде скрипта на изображении выше?
Скрипт:
#!/bin/bash
touch -- -file
rm -f -file
ls -- -file && echo "Существует" || echo "Удалён"
Описание:
В Bash --
обозначает конец списка опций, после которого все следующие аргументы интерпретируются как позиционные, даже если начинаются с -
.
touch -- -file
— создаёт пустой файл с именем ‘-file
‘, при этом--
предотвращает интерпретацию-file
как опции;rm -f -file
пытается удалить опцию-file
, не файл, поэтому команда завершится ошибкой, а файл останется;ls -- -file && echo "Существует" || echo "Удалён"
— т.к. файл ‘-file
‘ не был удалён, команда выведет"Существует"
.
Удалить файл корректно можно командой: rm -- './-file'
.

#4. Что выведет скрипт на изображении выше?
Скрипт:
#!/bin/bash
export VAR="outer"
bash -c '
read VAR <<< "inner"
echo "$VAR"
'
echo "$VAR"
Описание:
Переменная VAR
экспортируется и доступна во вложенной оболочке bash -c
, но внутри неё read VAR <<< "inner"
присваивает только в рамках вложенного процесса. Во внешнем shell переменная не меняется.
В bash оператор <<<
(here-string) передаёт строку на вход (stdin) команды или программы. Аналог пайпа |
, но без создания подпроцесса.

#5. Что выведет скрипт на изображении выше?
Скрипт:
#!/bin/bash
trap 'echo "Скрипт завершён"' EXIT
echo "Сообщение 1"
exit 0
echo "Сообщение 2"
Описание:
Команда exit 0
завершает скрипт до строки echo "Сообщение 2"
. Однако сработает trap
на EXIT
, который был установлен в начале. Это очень полезная техника для выполнения действий очистки или логирования при завершении работы.