Обойти начальный ноль:
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[@]}"
Если посмотреть исходный код реализации 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