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