Какое регулярное выражение подходит для распознавания имени файла переменной длины?

После некоторых исследований и опробования различных исправлений, кажется, решение было номером 6 на «Почему мое приложение не работает под systemd, когда я могу запустить его напрямую? ».

Вместо использования

ExecStart=/home/alex/apache-maven-3.6.1/bin/mvn exec:java -Dexec.mainClass="org.jitsi.sphinx4http.server.HttpServer"

Мне нужно было использовать линию

ExecStart=/bin/bash -c '/home/linguini/apache-maven-3.6.1/bin/mvn exec:java -Dexec.mainClass="org.jitsi.sphinx4http.server.HttpServer"'

Важной частью было выполнение /bin/bash -c ''для запуска команды в соответствующей оболочке.

3
19.11.2020, 12:35
1 ответ

Было бы проще использовать zshкак локальную, так и удаленную оболочку:

ssh root@$RMT_IP zsh << EOF
  set -o extendedglob # for (#c10)

  for file in ${(qq)BASE_NAME}-[0-9](#c10).${(qq)FILE_EXTENSION}(N); do
    tar -rf ${(qq)BASE_NAME}.tar \$file --remove-files
  done
EOF

[0-9](#c10)соответствует последовательности из 10 десятичных цифр.См. также [0-9]##то же, что [0-9](#c1,)для одной или нескольких цифр или <100000-9999999999>(, который не требуетextendedglob)для последовательностей десятичных цифр, составляющих числа в этом диапазоне.

sshdНа сервере запускается оболочка входа пользователя для интерпретации кода, переданного в качестве аргумента. Поскольку мы не знаем, что это (часто для root, это просто sh), мы просто делаем этот код zsh, чтобы запустить оболочку zshи передать код zshна стандартный ввод.

Использование здесь -документа, подобного этому, упрощает создание кода оболочки, который будет интерпретироваться удаленной оболочкой. Поскольку EOFне указан в кавычках, локальная оболочка будет выполнять расширения локально.

Важно отслеживать, какие расширения должны выполняться локально, а какие — удаленной оболочкой.

Выше ${(qq)BASE_NAME}расширяется локальной оболочкой, мы используем флаг расширения параметра (qq), чтобы заключить результат в одинарные кавычки, чтобы удаленная оболочка восприняла его как литеральную строку.

$fileдолжен быть расширен удаленной оболочкой, поэтому мы добавляем к нему префикс \, чтобы литерал $fileпередавался удаленной оболочке.

Если zshнедоступен на удаленном компьютере, а bashесть, вы можете выполнить (по-прежнему, используя zshлокально):

ssh root@$RMT_IP bash --norc << EOF
  shopt -s extglob nullglob # for +(...)
  export LC_ALL=C

  for file in ${(qq)BASE_NAME}-+([0-9]).${(qq)FILE_EXTENSION}; do
    tar -rf ${(qq)BASE_NAME}.tar "\$file" --remove-files
  done
EOF

bashне имеет эквивалента оператора glob zshx(#c10), но с extglobон поддерживает подмножество операторов ksh (, а не {10}(x), хотя, к сожалению, здесь ), включая +(x)который соответствует одному или нескольким x. Так что +([0-9])будет соответствовать одной или нескольким цифрам, а не только 10.

Чтобы сопоставить 10 цифр, вы все еще можете использовать [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].

5
18.03.2021, 22:48

Теги

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