Почему мой скрипт оболочки не принимает аргументы при запуске из PATH?

Почему мой скрипт оболочки не принимает аргументы при запуске из PATH?

Я только что скомпилировал исходный код программы под названиемJohnTheRipper. В настоящее время, если я хочу запустить, johnмне нужно cdвойти в run/каталог и выполнить его с помощью ./john. Однако я бы предпочел иметь возможность запускать johnкоманду из любого каталога, как если бы она была установлена ​​в системе. Я не могу создать псевдоним для этого, потому что мне нужно иметь возможность передавать параметры в двоичный файл. Поэтому я попытался создать небольшой скрипт оболочки.

#!/bin/bash

/home/username/tools/JohnTheRipper/run/john $@

Я поместил этот скрипт в /usr/local/binтак, чтобы он был в моем пути. Этот скрипт работает, ноТОЛЬКОесли я запущу его, указав путь.

$ ls john -la
-rwxr-xr-x 1 root root 56 Mar 20 03:54 john
$ ./john --test
Will run 4 OpenMP threads
Benchmarking: descrypt, traditional crypt(3) [DES 256/256 AVX2-16]... (4xOMP)
...

Это не сработает, если я попытаюсь запустить его с использованием $PATHпеременной среды

$ which john
/usr/local/bin/john
$ john --test
bash: syntax error near unexpected token `--test'

Почему так? Почему аргументы командной строки не передаются в мой скрипт оболочки? И как мне настроить его так, чтобы я мог запустить команду johnиз любого каталога, что позволит мне передавать ей аргументы?

ПримечаниеРешение должно иметь возможность принимать относительные пути при передаче параметров john. Например, если я нахожусь в каталоге d/с файлом, wordlist.txtя хочу иметь возможность запустить john следующим образом:

john --wordlist=./wordlist.txt

решение1

Theкомментарий Камиля Мациоровскипомог мне решить эту проблему. Это была ошибка пользователя.

$ type -a john
john is aliased to `(cd ~/tools/JohnTheRipper/run/ && ./john )'
john is /usr/local/bin/john

Выше вы можете видеть вывод type -a. Изначально я создал псевдоним, который использовал индекс, и когда это не сработало, я попытался создать символическую ссылку на исполняемый файл, я пробовал разные псевдонимы и пытался создать вышеупомянутый скрипт. Однако ни один из них не сработал, потому что каждый раз, когда я вносил изменения, .bashrcя запускал

$ source .bashrc

Я не знал, что sourceэто не перезапишет мой оригинальный johnпсевдоним... Поскольку псевдонимы имеют приоритет над $PATHпеременной, все это время johnвыполнялась та же исходная подоболочка, которая не принимала аргументов. Запустив unalias john, теперь все работает.

ПРИМЕЧАНИЕЧто касается создания символической ссылки в /usr/local/bin, я согласен, что это было бы лучшей альтернативой, но, к сожалению, в данной ситуации это не работает, как вы можете видеть из следующего вывода:

$ ls -la john
lrwxrwxrwx 1 root root 39 Mar 20 12:31 john -> /home/username/tools/JohnTheRipper/run/john
$ john --test
fopen: $JOHN/john.conf: No such file or directory

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