тире: почему я получаю сообщение об ошибке «Синтаксическая ошибка: EOF в подстановке обратных кавычек ”Когда мой скрипт даже не содержит обратной кавычки?

Если вы заранее знаете, сколько цифр нужно дополнить, это можно сделать довольно просто: объединение функций обработки строк и арифметики оболочки. Чтобы увеличить до 3 цифр, наберите номер от 1000 и удалите начальную 1 .

for current_name in *[0-9]*; do
  # Split the name into prefix, digits, suffix
  prefix=${current_name%%[0-9]*}; suffix=${current_name#"$prefix"}
  # Pad the digits
  digits=${suffix%%[!0-9]*}; suffix=${suffix#"$digits"}
  digits=$((digits+1000)); digits=${digits#1}
  # Rename the file
  new_name="$prefix$digits$suffix"
  if [ "$new_name" != "$current_name" ]; then
    mv -- "$current_name" "$new_name"
  fi
done
3
21.04.2019, 06:42
1 ответ

Вот упрощенный тестовый пример:

trap '
        trap    - HUP EXIT || exit "$?"
        kill -s HUP    "$$" || exit "$?" ' HUP INT
kill -HUP $$
$ dash dash-bug
dash-bug: 3: /home2/ahq/dash-bug: Syntax error: EOF in backquote substitution

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

Это было вызвано использованием -после -бесплатной ошибки, которая была исправлена, начиная с dash 0.5.9, но все еще присутствует в dash 0.5.8 из стабильной версии Debian 9.8 (stretch ), Ubuntu 18.04 (бионический )и Ubuntu 18.10 (космический ).

Это коммит , в котором это исправлено:

commit 6c3f73bc536082fec38bd36e6c8a121033c68835
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date:   Thu Oct 2 08:26:06 2014 +0800

    [EVAL] Fix use-after-free in dotrap/evalstring

    The function dotrap calls evalstring using the stored trap string.
    If evalstring then unsets that exact trap string then we will end
    up using freed memory.

    This patch fixes it by making evalstring always duplicate the string
    before using it.

    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Обходной путь -состоит в том, чтобы поместить обработчик прерывания в функцию --, чтобы никакие команды не запускались после сброса прерывания, пытающегося использовать строку действия после того, как оно было освобождено:

sighandler(){
    trap - "$sig" EXIT || exit "$?"
    kill -s "$sig" "$$" || exit "$?"
}
for sig in HUP INT QUIT ALRM TERM; do
    trap "sig=$sig; sighandler" "$sig"
done

kill -s HUP "$$"
3
27.01.2020, 21:20

Теги

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