LINUX.ORG.RU

sed, не работает замена символов через crontab

 ,


0

1

Помогите разобраться, есть такой пример:

cd /myfolder
comment="$(echo "MyComment" | sed 'y/åāáǎàäčēéěèģīíǐìķļņøōóǒòöšūúǔùǖǘǚǜžĀÁǍÀÅČĒÉĚÈĢĪÍǏÌĶĻŅŌÓǑÒŠŪÚǓÙǕǗǙǛŽ/aaaaaaceeeegiiiiklnoooooosuuuuüüüüzAAAAACEEEEGIIIIKLNOOOOSUUUUUUUUZ/')"
echo "$comment" > /myfolder/myfile.txt

Отлично работает при ручном запуске, но через crontab создается пустой файл. В чем ошибка?

Мб с правами что-то? Попробуй все операции производить в домашнем каталоге ~/myfolder/myfile.txt

redwagon
()

Скорее всего, проблема с локалью.

Поробуй:

export LANG="en_US.utf8"
# или
export LC_ALL="en_US.utf8"
# или твою любимую локаль c utf8

echo "MyComment" | sed 'что-то с утф-символами'
anonymous
()
Ответ на: комментарий от NightCat

Ты похоже вообще не понимаешь что делаешь. Вот тебе как пример в одну строчку, остальное не нужно:

echo "123"| sed s/123/321/ > /home/udod/text.file

redwagon
()
Ответ на: комментарий от redwagon

Там все гораздо сложнее, мне xml в цикле надо парсить:

comment="$(xmlstarlet sel "MY_XPATH" $i)"

NightCat
() автор топика
Ответ на: комментарий от anonymous

Точно проблема с локалью в crontab. Спасибо большое, помогло.

NightCat
() автор топика

Вангую пустую переменную PATH.

Замени sed на /bin/sed или пропиши PATH=/bin:/sbin:/usr/bin:/usr/sbin в начало crontab-файла.

Radjah ★★★★★
()
28 ноября 2020 г.
Ответ на: комментарий от Radjah

Во Fряхе, например, sed распологается в «/usr/bin/sed».

Я бы не рекомендовал изменять Системные Переменные, вроде SHELL, PATH, HOME, LOGNAME, USER «не Глядя», поэтому если предполагается Запуск Скрипта из под Cron/Anacron/fcron/Hcron, то в Начало Скрипта сто́ит добавить «Оптимизацию» PATH.

Эти Строки не содержат Вызовов Внешних Программ (printf и eval встроены в Bourne Shell, ASH, BASH, KSH, ZSH, и даже CSH/TCSH, но Это Отдельная Тема), кроме /usr/bin/env, которая там и находится, по крайней мере, в: FreeBSD, OpenBSD, CentOS, NetRunner, Debian, SliTaz, Arch Linux, SunOS,… Только в Haiku OS — «/bin/env», но без Исключений не было бы Правил. Кстати, «/bin/sh» должно работать Везде.

#!/bin/sh
# Раньше тут было «#!/usr/bin/env sh», но не Везде Работало.
#DeBuG#printf "First  PATH=«%s».\n" "${PATH}" >> "/root/ScriptingDeBugMessages.Txt"
# При ЗаПуске из под «Cron», Переменная «${PATH}» может СоДержать не Все, НеОбХодимые для Работы Скрипта, Пути.
for __NeededPath in "/sbin" "/bin" "/usr/sbin" "/usr/bin" "/usr/local/sbin" "/usr/local/bin" "$(eval printf "~${USER}/bin")"
 do
  # Если Путь Не НаХодитСя в Начале или после ДвоеТочия в Переменной «${PATH}», то НужНо Добавить.
  [ -n "${__NeededPath}" -a "${PATH#"${__NeededPath}"}" == "${PATH}" -a "${PATH#*[\:]"${__NeededPath}"}" == "${PATH}" -a -d "${__NeededPath}" ] && PATH="${PATH%:}${PATH:+:}${__NeededPath}"
  # Предыдущая Конструкция сбойнёт, если Переменная «${PATH}» была равна ":" или какой-нибудь ещё НеВедомой Ереси, но ТакОго (В Работающей Системе) Быть не Должно, ПоЭтому Допустимо СЭкономить МиллиСекунды на более Строгих Проверках.
 done
unset __NeededPath
#DeBuG#printf "Second PATH=«%s».\n" "${PATH}" | tee -a "/root/ScriptingDeBugMessages.Txt"

Данный Код Добавляет примерно 14–18 ms на Intel Atom 1 600 MHz. Список Добавляемых Путей — ДоПолнить «По Вкусу».

CrazyMihey
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.