Вопрос или проблема
На 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-системами.