Интерпретация сообщений об ошибках

Интерпретация сообщений об ошибках

В моих скриптах есть функция с именем 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 messagesstill означает /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

Надеюсь, кто-нибудь сможет дать ссылку на лучшее решение.

Связанный контент