В inittab попытка установить переменную окружения перед выполнением скрипта

Обойти начальный ноль:

somecmd logs-0{2..9}.tar.bz2  logs-{10..15}.tar.bz2

( 02..06 в этом примере тривиально обработать таким образом.)

Или используйте printf :

somecmd $(printf "logs-%02d.tar.gz " {2..15})

Это основано на разделении слов и работает только до тех пор, пока в имени файла нет глобальных символов или пробелов.

Если все сделано правильно, это будет просто, но немного долго:

files=()
for x in {2..15} ; do
    files+=( "$(printf "logs-%02d.tar.gz" $x)" )
done
somecmd "${files[@]}"
1
25.03.2016, 02:41
1 ответ

Если посмотреть исходный код реализации sysvinit в Linux, то она действительно запускает shell, когда видит специальные символы shell, но добавляет exec перед строкой, что позволяет ставить перенаправления и использовать специальные символы в аргументах, но не устанавливать переменную окружения таким образом.

 } else if (strpbrk(proc, "~`!$^&*()=|\\\{}[];\"'<>?")) { {
 /* Проверяем, нужно ли запускать оболочку для этой команды */
 /* Передаем командную строку оболочке */
 args[1] = SHELL;
 args[2] = "-c";
 strcpy(buf, "exec ");
 strncat(buf, proc, sizeof(buf) - strlen(buf) - 1);
 args[3] = buf;
 args[4] = NULL;

Прямым решением будет запуск env.

scpt:234:once:env RSYNC_OPTIONS=-q /path/to/script/script.sh arg1 arg2 arg3 2>&1

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

scpt:234:once:>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3 2>&1
scpt:234:once:2>&1; RSYNC_OPTIONS=-q exec /path/to/script/script.sh arg1 arg2 arg3
1
27.01.2020, 23:48

Теги

Похожие вопросы