Исполняемый файл с именем 'test' находится в $ PATH, но не запускается

13

У меня есть файл в $ HOME / bin (перед тем, как вы спросите, да, он находится в моем пути), testкоторый, как я подтвердил, может нормально выполняться, когда я запускаю его с полным путем к файлу. Тем не менее, я получаю действительно странную проблему, когда не запускаю ее таким образом. Когда я просто запускаю testв терминале, он ничего не делает и сразу возвращается. Я знаю, что это не проблема поиска файла по нескольким причинам:

  1. Там нет сообщения об ошибке. Обычно, если файл не может быть найден или не может быть выполнен, будет напечатано сообщение о том, что это так.

  2. Запуск по- which testпрежнему возвращает правильный путь к файлу.

  3. Вероятно, самый странный из всех - сценарий прекрасно работает при запуске strace. Я попытался использовать, straceчтобы увидеть, смогу ли я выяснить, что происходит, но когда я запустил его strace, это сработало, как и ожидалось, с 0 проблемами.

ContronThePanda
источник
Первый совет на wiki-dev.bash-hackers.org/scripting/debuggingtips
Марк Вагнер,

Ответы:

45

testэто неудачное имя, это стандартная утилита для условных тестов . (Это на самом деле та же команда, что и [в if [ ... ], она просто выглядит как синтаксическая вещь, но на самом деле это просто обычная команда.)

testОн также встроен, например, в Bash, поэтому запуск testникогда не ищет ваш двоичный файл с пути.

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]

test без аргументов просто возвращает 1 (false).

Для запуска strace testне требуется встроенная оболочка, поскольку она straceсама не реализует никаких утилит. Он просто использует то, что находит в вашем PATH. Обратите внимание, что у вас, вероятно, есть стандарт testв /bin/testили /usr/bin/test, так что если это будет первым PATH,strace запустите запустить.

На моем Bash whichтакже есть внешняя команда, поэтому она не имеет представления о встроенных функциях. С другой стороны, команда является встроенной в оболочку, и покажет , что .typetype testtest is a shell builtin

Смотрите также: почему бы не использовать "который"? Что использовать тогда?

ilkkachu
источник