====== Удалить '\r' ======
Если создавать файлы скриптов в Windows не настроив предварительно редактор, или копировать весь текст, то скорее всего в тексте окажется симвор ''\r'', обычно он скрыт от глаз, но сильно мешает запуску скриптов в Linux.
Вот несколько вариантов как от них избавиться...
===== Var 1 =====
sudo apt install dos2unix
dos2unix имя_файла
===== Var 2 =====
sed -i 's/\r$//' имя_файла
===== Var 3 =====
perl -pi -e 's/\r$//' имя_файла
===== Var 4 =====
tr -d '\r' < input.sh > output.sh
===== Скрипт =====
Скрипт для удаленя '\r' символа возврата каретки, на коотрый любит ругаться bash.\\
Для работы потребуется [[niceos:fzf|fzf]], устанавливается автоматически.\\
#!/bin/bash
# ==AUTOEXEC==
# === \R remover ===
# * удалить из файлов скриптов '\r' на которые bash любит ругаться
#
# Каталоги для поиска
TOP_LEVEL_DIR="$HOME"
RECURSIVE_DIR="$HOME/scripts"
# Установка fzf при необходимости
if ! command -v fzf >/dev/null; then
echo "🔧 Установка fzf..."
if [ "$EUID" -ne 0 ]; then
sudo apt install -y fzf
else
apt install -y fzf
fi
fi
# Поиск файлов:
# - в $HOME без подкаталогов
# - в ~/scripts с подкаталогами
mapfile -t FILES < <(
find "$TOP_LEVEL_DIR" -maxdepth 1 -type f -name "*.sh" 2>/dev/null
find "$RECURSIVE_DIR" -type f -name "*.sh" 2>/dev/null
)
# Проверка наличия файлов
if [ ${#FILES[@]} -eq 0 ]; then
echo "🟡 Скрипты .sh не найдены."
exit 0
fi
# Выбор через fzf
SELECTED=$(printf "%s\n" "${FILES[@]}" | fzf --multi --prompt="Выберите скрипты для исправления \\r: ")
if [ -z "$SELECTED" ]; then
echo "🔕 Отменено."
exit 0
fi
# Подтверждение
echo
echo "Будут обработаны следующие скрипты:"
echo "$SELECTED"
echo
read -p "Удалить символы возврата каретки (\\r)? [y/N] " CONFIRM
[[ "$CONFIRM" =~ ^[Yy]$ ]] || { echo "❌ Отменено."; exit 0; }
# Удаление \r
while IFS= read -r FILE; do
echo "✏️ Обработка: $FILE"
sed -i 's/\r$//' "$FILE"
done <<< "$SELECTED"
echo "✅ Завершено."
exit 0