
У меня есть 2 небольшие функции для сокращения set -x
/ set +x
, а именно:
sx () {
export PS4='+ [${BASH_SOURCE##*/}:${LINENO}]'
set -x
}
и
sz () {
set +x
export PS4=
}
Эти 2 функции находятся в файле, functons.sh
которыйисточникd из ~/.bashrc
, и видимый в сетиздесь.
Сразу после входа в новый сеанс bash я пытаюсь выяснить, где sz()
находится функция, например:
$ shopt -s extdebug; declare -F sz; shopt -u extdebug
sz 25 /Users/jab/src/git/hub/jab/src/bash/keyboard/z.sh
Это показывает, что bash
функция sz()
объявлена в z.sh
, но в этой строке есть другая функция, zzz()
, в сетиздесь.
Результат функции sx()
(и всех моих бесчисленных других функций) правильный.
$ shopt -s extdebug; declare -F sx; shopt -u extdebug
sx 428 /Users/jab/src/git/hub/jab3/src/bash/functons.sh
Почему declare -F
команда возвращает неверный результат для sz
функции?
решение1
У вас также есть псевдоним functons.sh
с тем же именем, что и у функции в другом вашем файле.
В functons.sh
:
alias zzz=sz
В z.sh
:
zzz () {
df -h
}
Это сбивает с толку bash
.
Пример:
$ cat f1
foo () { echo hello; }
alias xfoo=foo
$ cat f2
xfoo () { echo beep; }
$ source f1
$ source f2
$ shopt -s extdebug
$ declare -F foo
foo 1 f2
Без xfoo
псевдонима в f1
:
$ source f1
$ source f2
$ shopt -s extdebug
$ declare -F foo
foo 1 f1
В bash
руководство также включен текст
В некоторых случаях использование псевдонимов может сбивать с толку.
в разделе «ОШИБКИ».