Как обрабатывать первый «%» в команде cron?

Это означает, что ваш установщик пакета используется каким-то другим процессом.
Самый простой способ избавиться от этого — убить процесс инициализации, т.е.

kill -9 -1

Предупреждение
Это выведет вас из системы уничтожит все процессы, так что сохраните для текущей работы
Метод неэффективный, но работает..

1
27.01.2021, 17:16
1 ответ

В crontab часть после спецификаций времени и до первого неэкранированного %составляет код, который будет передан оболочке (в качестве аргумента после shи-c). То, что идет после этого первого %, составляет строки, которые будут переданы в эту оболочку через ее стандартный ввод.

Фактически, с помощью строки crontab, такой как:

* * * * * shell code%line 1%line 2

cronкаждую минуту делает эквивалент этого шелл-кода:

printf '%s\n' 'line 1' 'line 2' | sh -c 'shell code'

Таким образом, вы не можете использовать его для хранения символа новой строки в переменной этого shell code.

Здесь, если вы хотите, чтобы новая строка сохранялась в переменной в этом коде, вы можете сделать

* * * * * eval "$(printf 'nl="\n"')"; echo "blah${nl}blah"

Однако вы можете сделать код просто sh, а затем передать код на стандартный ввод:

* * * * * sh%nl='%'%echo "blah${nl}blah"

В этом случае cronбудет выполняться sh -c sh, а стандартный ввод процесса, выполняющего этот sh, выполняющий другой sh, будет:

nl='
'
echo "blah${nl}blah"

Другой вариант — указать cronиспользовать оболочку, которая поддерживает форму кавычек в стиле ksh93 -$'...'(, например ksh93/ zsh/bash)вместо shи делать:

SHELL=/bin/zsh
* * * * * nl=$'\n'; echo "blah${nl}blah"
2
18.03.2021, 22:34

Теги

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