Ошибка скрипта Bash при попытке создать снимок

Вопрос или проблема

Я пытаюсь создать снимок, используя сценарий Bash, как показано ниже, но возникла ошибка.

Операционная система: FreeBSD,

Версия: 13.2,

Сценарий: Bash

#!/usr/local/bin/bash
name="17102023_1234"
zfs snapshot data/library@$name

Я запустил этот простой сценарий bash, но получил ошибку, как показано ниже.

‘ в именованном символе ‘ ‘data/library@17102023_1234

Это работает, когда я помещаю ‘17102023_1234’ после @ вместо переменной.

Любая помощь будет оценена.

Спасибо.

  • Геральд Шнайдер указал на одну “невидимую” ошибку. ℳicro$hit Windoofus, M$‑ĐO$ и некоторые другие операционные системы используют два байта, возврат каретки (CR) и перевод строки, чтобы указать конец строки. Однако системы, совместимые с POSIX™, такие как FreeBSD (в основном таковые), используют только один байт перевода строки, поэтому CR становится частью полезной нагрузки строки.
  • name="17102023_1234"␍␊
    

    Гипотеза Геральда заключается в том, что значение name становится 17102023_1234␍ (байт невидим), поэтому

    zfs snapshot data/library@$name
    

    вызывает команду

    zfs snapshot data/library@17102023_1234␍
    

    Обычно эта проблема возникает из-за копирования и вставки. Вы можете использовать dos2unix из порта converters/unix2dos или просто устранить байты CR с помощью

    sed -e's/\r//' -i'' ./my_sript.sh # заменить CR ε на месте
    
  • К вашему сведению, время и дата уже являются частью каждого снимка: проверьте свойство creation. Я использую простой счетчик в качестве имени снимка, потому что только по свойству creation вы не можете узнать, существовали ли какие-либо промежуточные снимки.

Ответ или решение

Ошибка при создании снимка с помощью Bash-скрипта на FreeBSD

Создание снимка с использованием Bash-скрипта может вызвать разные ошибки, и в вашем случае ошибка связана с неправильной интерпретацией переменной. Рассмотрим детально вашу ситуацию и предлагаемое решение.

Описание проблемы

Вы пытаетесь выполнить следующий Bash-скрипт:

#!/usr/local/bin/bash
name="17102023_1234"
zfs snapshot data/library@$name

Запуск этого скрипта приводит к ошибке:

' in named character ' 'data/library@17102023_1234

При этом, если вы напрямую указываете имя снимка вместо использования переменной, скрипт работает корректно.

Причина возникновения ошибки

Главной причиной данной ошибки является наличие невидимых символов, особенно символа перехода каретки (CR или \r), который может случайно попасть в вашу переменную name. Это часто происходит в результате копирования и вставки кода из текстовых редакторов, которые используют разные символы для обозначения конца строки.

Ваша переменная name может фактически содержать значение "17102023_1234\r", что вызывает неправильное выполнение команды zfs, поскольку \r интерпретируется как часть имени снимка.

Решение проблемы

Для устранения этой проблемы вы можете воспользоваться одной из следующих рекомендаций:

  1. Использование утилиты dos2unix: Эта программа преобразует файлы с символами конца строки в формате Windows (CRLF) в формат Unix (LF), удаляя лишние символы. Установите пакет converters/unix2dos, если он у вас еще не установлен, и выполните:

    dos2unix ./my_script.sh
  2. Удаление символа CR с помощью sed: Если у вас нет возможности установить дополнительные утилиты, вы можете воспользоваться командой sed для удаления символов CR непосредственно в вашем скрипте:

    sed -e 's/\r//' -i'' ./my_script.sh

После выполнения одной из этих команд, ваша переменная name будет корректно интерпретироваться, и команда zfs snapshot data/library@$name сможет выполниться без ошибок.

Дополнительная информация

Важно отметить, что при создании снимков ZFS, дата и время уже сохраняются в свойствах снимка. Использование простого счетчика в имени снимка может быть более удобным для контроля версий. Это поможет отличать промежуточные состояния, которые могут не быть отражены в дате создания.

Заключение

Надеюсь, объясненная проблема и предложенные решения помогут вам успешно создать снимок с помощью Bash-скрипта. Если возникнут дополнительные вопросы, не стесняйтесь их задавать. Удачи в работе с ZFS и Bash!

Оцените материал
Добавить комментарий

Капча загружается...