Команды переходят в домашний каталог, создают foo и файл bar, дописывают в bar команду ls foo, делают его исполняемым и запускают. Повторное выполнение дописывает строку, а не заменяет файл.
Разбор создания и запуска исполняемого скрипта
Команды переходят в домашний каталог, создают foo и файл bar, дописывают в bar команду ls foo, делают его исполняемым и запускают. Повторное выполнение дописывает строку, а не заменяет файл.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разберите последовательность операций, которые происходят при выполнении представленного ниже скрипта, и опишите, как они меняют состояние файловой системы.
bash
# !/bin/bash
# рассуждение вслух более ценно чем верный ответ
cd ~
mkdir foo
touch bar && echo "ls foo" >> bar
chmod +x bar
./bar
Ответ
Команды переходят в домашний каталог, создают foo и файл bar, дописывают в bar команду ls foo, делают его исполняемым и запускают. Повторное выполнение дописывает строку, а не заменяет файл.
В типичном Bash без set -e неудачный mkdir при уже существующем foo не остановит последующие команды. touch создаёт отсутствующий bar или меняет его timestamps; && разрешает echo только при успехе touch. >> дописывает команду в конец, chmod +x добавляет право исполнения.
Строка # !/bin/bash — комментарий, а не корректный shebang #!/bin/bash. Если bar — обычный текст без shebang, запускающий Bash после отказа ядра обычно интерпретирует его сам. Для нового пустого foo ls ничего не напечатает. Отдельная первая команда bash запускает вложенную оболочку: для интерактивного ввода и для файла это нужно учитывать. Существующие foo/bar могут изменить результат, поэтому запускать пример в реальном домашнем каталоге для проверки не стоит.