Как мой bash может находить двоичные файлы, если двоичный файл не находится в $ PATH?

#linux #bash

#linux #bash

Вопрос:

Я получил виртуальную машину класса, которая использует ubuntu 18.04 в качестве базы. Терминал — bash, и я подтвердил с

 echo $0
  

Есть команда под названием elastalert, которая автоматически завершается, если я просто набираю «elast», а затем нажимаю tab. Это довольно нормально для любых двоичных файлов, которые находятся в $ PATH.

Однако, когда я делаю

 which elastalert
  

Он не возвращает никакой информации. Я искал файл из корневого каталога

 $ sudo find -name elastalert 2>null
./backup/elastalert
./elastic_stack/elastalert
  

Однако оба пути выше являются каталогами. Я проверяю $ PATH, он не содержит указанного выше пути

 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  

Вопрос: Какой механизм Linux позволяет мне автоматически заполнять elastalert, но elastalert не существует в $ PATH?

Обновить:

 $type elastalert
elastalert is aliased to `docker run -it --rm --net=bridge --network=labs_esnet --name elastalert --hostname elastalert -v /labs:/labs --link elasticsearch hasecuritysolutions/elastalert:v0.1.31 /usr/local/bin/elastalert'
  

Есть несколько вопросов о том, зачем нужен sudo. Как вы можете видеть ниже, файлы находятся в каталогах, доступных только для root.

 $ sudo find -type f -name elastalert 2>/dev/null
[sudo] password for student: 
./var/lib/docker/overlay2/c8b9f4ad647fad4090665c6ee6d63af998265ba008756f6dd24563245043d091/diff/usr/local/bin/elastalert
$ sudo file ./var/lib/docker/overlay2/c8b9f4ad647fad4090665c6ee6d63af998265ba008756f6dd24563245043d091/diff/usr/local/bin/elastalert
./var/lib/docker/overlay2/c8b9f4ad647fad4090665c6ee6d63af998265ba008756f6dd24563245043d091/diff/usr/local/bin/elastalert: Python script, ASCII text executable
  

Комментарии:

1. Добавьте вывод type elastalert к вашему вопросу (без комментариев).

2. попробуйте sudo find -type f -name elastalert 2>null или sudo find -name elastalert -ls 2>null` . Удачи.

3. Кроме того, вы сказали, which elastalert он не возвращает никакой информации. . Нет информации? Или which: no elasalert in (... Не заставляйте нас гадать, лучше всегда включать в сообщения об ошибках текст extact :-). Удачи.

4. alias foo=bar , и вы можете автоматически выполнить команду «foo», но она не будет отображать никакой информации при вводе which foo .

5. Вы даже можете установить автозаполнение для случайного слова, которое вообще ничем не является, даже псевдонимом: complete -W 'bar baz' foo ; foo теперь имеет bar и baz в качестве завершения.

Ответ №1:

Я не могу дать вам конкретный ответ, но вы можете найти подсказки в разделах информационного текста bash 8.6, 8.7 и 8.8.

В разделе 8.8 показано, что сценарии, способствующие завершению, могут быть установлены отдельно от программ, которые объясняли бы, почему вы получаете завершение без указанной программы, находящейся на вашем ПУТИ.