В моих скриптах есть функция с именем messages
. Я написал ее в Linux Mint, проблем с запуском не возникло, а когда я перенес ее на станцию Debian Buster, функция конфликтует с /usr/bin/messages
.
У меня есть скрипт запуска, который вызывает скрипт messages
:
стартовый_скрипт
# call to messages script
. messages
Сообщения
messages() {
# reformat the arguments and return them
}
позже startup_script
messages "This is a message"
Который бросает
./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
messages: could not open mailbox `/path/to/my/script/<string passed to my function>': No such file or directory
Поэтому я получаю кучу ошибок, связанных с /usr/bin/messages
вызовом вместо моей функции.
После добавления type messages "This is a message"
соответствующий вывод будет следующим:
messages is /usr/bin/messages
У меня есть возможность переименовать мою функцию¹, но, возможно, есть лучший способ справиться с этой ситуацией.
Как мне заставить мой скрипт игнорировать системные двоичные файлы и использовать мои собственные функции?
¹ Функция вызывается в нескольких скриптах много раз, поэтому просто изменить имя — не самый простой вариант.
решение1
Вот как это . file
работает:
Если
file
не содержит <слэш>, оболочка будет использовать указанный путь поиска дляPATH
поиска каталога, содержащего файл.
Такое поведениеспецифицировано POSIX.
Ваша первая ошибка —
./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
То же самое происходит, когда вы звоните . echo
:
-bash: .: /bin/echo: cannot execute binary file
Вы пытаетесь получить исходный файл двоичного файла /usr/bin/messages
. Фактически ваш файл, в котором определена функция, вообще не является исходным файлом, функция не определена в текущем скрипте. Это означает, что later messages
still означает /usr/bin/messages
, а не функцию.
Соответствующая строка должна быть . ./messages
или . /full/path/to/messages
(т.е. путь ктвойфайл, а не двоичный файл).
решение2
Интерпретация сообщений об ошибках
Посмотрите на номер строки в сообщении об ошибке.. Таким образом, вы узнаете, в какой строке ошибка. Это было скрыто от нас, поскольку вы показали нам несколько строк из скрипта, содержащего более 35 строк.
Какой файл выполняется.
Когда вы указываете файл с помощью . file-to-source
или file-to-run
, каталоги, перечисленные в переменной окружения, $PATH
просматриваются слева направо. Текущий каталог не входит в этот список, так как это может представлять угрозу безопасности или, по крайней мере, вызывать путаницу. Это запускает программу в текущем каталоге, вы должны указать, что она находится в текущем каталоге. например, . ./file-to-source
или ./file-to-run
(нет необходимости указывать полный путь).
В Unix-системах это было .
в PATH, пока не стало понятно, что это проблема. Например, поместить программу, которая называется ls
в текущий каталог. CMD в Windows от Microsoft все еще .
неявно имеет в PATH
, вы не можете удалить его. Это одна из причин высокого уровня вредоносного ПО в этой ОС.
Попался
.
относится к текущему рабочему каталогу, а не к каталогу, в котором находится скрипт.
Чтобы решить эту проблему, можно сделать что-то вроде этого.
(
cd "$(dirname "$(readlink -f "$0")")"
script_dir="$(pwd)"
)
script_dir/other_script
Надеюсь, кто-нибудь сможет дать ссылку на лучшее решение.