Ловушка Bash работает, но выполняется при выходе из всего скрипта?

Я не понимаю, почему вы сохраняете команду как переменную. Почему бы не сделать что-то вроде того, что я показываю ниже, и избежать проблемы?

shopt -s nullglob
for file in tmp/*.pdb; do
    base="$(basename ${file} .pdb)"
    command --option "[${base}]foo"
done
shopt -u nullglob

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

for file in tmp/*.pdb; do
  if [ -e "$file" ]; then
        base="$(basename ${file} .pdb)"
        a="command --option [${base}]foo"
        ${a}
done

Сохранять команды как переменные редко бывает хорошей идеей. Другой подход - сохранить вместо этого параметры как переменные:

shopt -s nullglob
for file in tmp/*.pdb; do
    base="$(basename ${file} .pdb)"
    a="--option [${base}]foo"
    command "$a"
done
shopt -u nullglob
1
11.05.2018, 21:20
2 ответа

En mis scripts, a menudo hago algo como esto al principio en los casos en los que estaré escribiendo archivos temporales:

scratch="$(mktemp -d)"
trap 'rm -fr "$scratch"' EXIT

Todos los archivos o directorios reales se pueden escribir por nombre (e. gramo.mkdir $scratch/foo; touch $scratch/foo/bar)en el transcurso del guión, pero la limpieza se realiza de inmediato al finalizar el guión con el trap.

0
27.01.2020, 23:43

Creo que estás buscando la señal RETURN:

[...] If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.
[...] If a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or a script run by the. or source builtins finishes executing.

Ejemplo:

$ bash
$ trap "echo shell exiting" EXIT
$ fn() { trap "echo function exiting" RETURN; }
$ fn
function exiting
$ (fn)
function exiting
$ value=$(fn); echo "$value"
function exiting
$ exit
shell exiting

y, en relación con la pregunta:

$ f2() { 
    local tmp=$(mktemp)
    trap 'rm "$tmp"' RETURN
    echo "$tmp"
    date >> "$tmp"
    cat "$tmp"
}
$ f2
/tmp/tmp.MHpI20X0a1
Fri May 11 14:29:01 EDT 2018
$ ls -l /tmp/tmp.MHpI20X0a1
ls: cannot access '/tmp/tmp.MHpI20X0a1': No such file or directory
4
27.01.2020, 23:43

Теги

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