Вы запускаете скрипт, который должен записывать текущее время в файл, но вместо аккуратной строки вроде lun.24 17:40:28 получаете что-то вроде lun.24% +17:40:40. Знакомо? Это классический пример того, как мелочи синтаксиса могут сбить с толку даже опытного пользователя. Давайте разберёмся, откуда берётся этот загадочный процент и как от него избавиться – без лишней теории, только практика.
Почему появляется символ % и как его убрать
Всё дело в том, как bash обрабатывает специальные символы. Посмотрите на две версии команды date:
# Вариант 1 (работает в терминале):
echo $(date +%a%d %X)
# Вариант 2 (из скрипта):
echo $(date +%a%d% +%X)
Видите разницу? В первом случае после %d стоит обратный слэш, который экранирует пробел. Во втором – знак % перед пробелом. Именно этот лишний символ и появляется в выводе. Bash интерпретирует % как специальный символ формата, а когда не находит за ним буквы (вроде %Y или %m), просто вставляет его как есть.
Как исправить:
1. Либо экранируйте пробел обратным слэшем:
echo $(date +%a%d %X)
2. Либо заключите формат в кавычки:
echo $(date "+%a%d %X")
Кстати, второй вариант надёжнее – кавычки предотвращают «поедание» пробелов оболочкой. Проверьте сами: если запустить скрипт после правки, процент исчезнет.
Типичные ошибки и как их избежать
1. Путаница между экранированием в терминале и скриптах
То, что работает в командной строке, не всегда сработает в скрипте. Например, обратный слэш может теряться при записи в файл. Всегда проверяйте команды через echo перед вставкой в скрипт:
# Так вы увидите реальный результат до запуска:
echo "date +%a%d %X"
2. Неправильное использование перенаправления
В исходном скрипте используется >>. Это безопасно, но если в пути есть пробелы, всё сломается. Лучше писать так:
xdg-mime query default inode/directory >> "/home/user/f1"
3. Лишние символы в переменных
Если после подстановки переменной появляются странные символы (вроде того же %), проверьте, нет ли пробелов или спецсимволов в значениях. Используйте printf “%q” для диагностики:
printf "%q" "$(date +%a%d% +%X)"
Совет от практика: если скрипт ведёт себя не так, как та же команда в терминале, добавьте set -x в начало – это покажет, как bash интерпретирует каждую строку.
Дополнительные нюансы работы с датами
Формат +%a%d %X выводит сокращённое название дня недели (например, «lun.» для понедельника в испанском), число месяца и время. Но будьте внимательны:
- Локализация может влиять на вывод (например, «lun» вместо «Mon»).
- Если нужно гарантировать английский язык, добавьте LC_TIME=en_US.UTF-8:
echo $(LC_TIME=en_US.UTF-8 date +%a%d %X)
И напоследок: если после исправления скрипта вы всё ещё видите %, проверьте, не добавлен ли он в сам файл f1 ранее. Иногда старые данные в файле могут вводить в заблуждение – очистите файл перед тестами.
Теперь вы знаете не только как убрать надоевший символ, но и как отлаживать подобные ошибки в будущем. Держите эту памятку под рукой, и пусть ваши скрипты работают как часы!