дата: ошибка преобразования даты на HP-UX, но не на Linux

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

На Linux:

$ touch 1 12

Нет проблем,создаются 1 и 12.

На SysV или HP-UX 11.31:

$ touch 1 12
date: неправильное преобразование

Я пробовал с LANG=C, та же ошибка. Почему?

Оригинальная команда touch поддерживала только установку времени изменения файла на текущее время.

Исторические системы System V ввели возможность указывать время в качестве первого аргумента, с синтаксисом [YY]MMDDhhmm (опциональный год, месяц, день, часы, минуты). В то время соглашение использовать тире и букву, за которыми следует значение для опциональных аргументов (например, -t …), еще не было полностью установлено. Это создало несовместимость с более ранними версиями, где подобные команды — touch 1 12 изначально означали установку временной метки для двух файлов с именами 1 и 12, но с того момента системы SysV начали интерпретировать 1 (или любой первый аргумент, состоящий полностью из цифр) как временную метку.

Некоторые современные Unix-системы, включая HP-UX, выбрали поддержание совместимости с этими версиями SysV. Другие, включая *BSD и недавние версии GNU, никогда не имели или отказались от поддержки этого синтаксиса.

Ранее версии POSIX указывали как touch TIME FILE, так и touch [-t TIME] FILE, но начиная с POSIX-2001, поддерживается только синтаксис с опцией -t.

Чтобы сделать ваш скрипт портативным, если возможно, чтобы первым аргументом команды touch был файл, имя которого состоит полностью из цифр или из цифр и точки, либо добавьте -- перед файлом (это то, что рекомендует POSIX, так что, надеюсь, это будет работать везде), либо добавьте ./ в начале имени файла:

touch -- 1 12

или

case "$file" in
  /*) :;;
  *) file="./$file";;
esac
touch "$file"

Согласно этой странице man hp для команды touch: http://h20565.www2.hp.com/hpsc/doc/public/display?docId=emr_na-c02273390

… команда ожидает следующую форму для touch:
touch time_str file_name

Эта форма распознается когда ни опция -r, ни опция -t, ни разделитель опций -- не указаны, и первый операнд состоит из всех десятичных цифр.

Это решение работает хорошо в “Interactive Unix 4.1.1”

#это вызывает ошибку
touch    1 2 2 3 4

#это работает
touch ./1 2 2 3 4

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

Почему в HP-UX возникает ошибка «date: bad conversion» при использовании команды touch, и как этого избежать

На первый взгляд, команда touch в системах Linux и HP-UX может показаться идентичной, однако важные различия в интерпретации аргументов адаптируют поведение на каждой системе. В этой статье мы рассмотрим причины возникновения ошибки «bad conversion» в HP-UX и предложим решения, чтобы избежать подобных проблем.

1. Основные отличия в поведении команды touch

В Linux использование команды touch 1 12 приводит к успешному созданию файлов с именами 1 и 12. В то же время в HP-UX, при выполнении аналогичной команды, вы получаете сообщение об ошибке:

date: bad conversion

Это связано с тем, что в системах на базе SysV, включая HP-UX, порядок аргументов новости требует особого внимания. Команда touch, запускаемая с числовыми аргументами, может интерпретировать первый аргумент как временной формат, если он состоит исключительно из цифр.

2. Исторический контекст

Исторически, в системах на базе SysV была добавлена возможность задавать временные метки с использованием синтаксиса [YY]MMDDhhmm, который отличается от традиционного использования команды touch. Однако в более современных версиях стандартов POSIX, только вариант с флагом -t был признан допустимым.

Разработка Linux и некоторых других Unix-систем, таких как BSD, сохранила первоначальный дух команды touch, позволяя использовать её без дополнительных флагов для простого создания файлов.

3. Решение проблемы с помощью аргумента --

Чтобы избежать конфликта с интерпретацией аргументов, можно использовать аргумент --, который считается стандартом POSIX. Этот аргумент говорит командной оболочке о том, что все последующие аргументы следует воспринимать как имена файлов:

touch -- 1 12

Альтернативным способом является добавление ./ перед именами файлов, что также предотвратит интерпретацию их как временных меток:

touch ./1 ./12

4. Рекомендации для обеспечения переносимости скриптов

Если вы пишете скрипты, которые будут работать в различных Unix-системах, учитывайте следующее:

  • Используйте -- для явного указания конца опций.
  • Добавляйте ./ перед именами файлов, состоящими из чисел, чтобы избежать неоднозначности.
  • Проверяйте версию и особенности команды на целевой системе с помощью команд, таких как man touch.
case "$file" in
  /*) :;;
  *) file="./$file";;
esac
touch "$file"

5. Заключение

Понимание различий в интерпретации команд между Linux и HP-UX поможет вам избегать распространенных ошибок, таких как «date: bad conversion». Следуя вышеприведенным рекомендациям, вы сможете написать более переносимые и устойчивые к ошибкам скрипты. Убедитесь, что у вас есть достаточные знания о командах и их поведении в разных операционных системах, чтобы оптимизировать свою работу в средах Unix.


Эта статья является полным руководством по проблеме и ее решениям, обеспечивая необходимую поддержку для IT-специалистов, работающих с различными Unix-системами.

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

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