Por que meu script de shell não aceita argumentos quando executado a partir do PATH?

Por que meu script de shell não aceita argumentos quando executado a partir do PATH?

Acabei de compilar o código fonte de um programa chamadoJohnO Estripador. Atualmente, se eu quiser rodar, johnpreciso cdentrar no run/diretório e executá-lo com ./john. No entanto, eu preferiria poder executar o johncomando a partir de qualquer diretório, como se estivesse instalado em todo o sistema. Não posso criar um alias para isso, porque preciso passar parâmetros para o binário. Então tentei fazer um pequeno script de shell.

#!/bin/bash

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

Coloquei esse script /usr/local/binpara que fique no meu caminho. Este script funciona, masAPENASse eu executá-lo especificando o caminho.

$ 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)
...

Não funcionará se eu tentar executá-lo usando a $PATHvariável de ambiente

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

Por que isso acontece? Por que os argumentos da linha de comando não estão sendo passados ​​para meu script de shell? E como posso configurá-lo para poder executar o johncomando a partir de qualquer diretório, permitindo-me passar argumentos?

ObservaçãoA solução deve ser capaz de aceitar caminhos relativos ao passar parâmetros para John. Por exemplo, se eu estiver no diretório d/com um arquivo, wordlist.txtquero poder executar john assim:

john --wordlist=./wordlist.txt

Responder1

Ocomentário de Kamil Maciorowskime ajudou a resolver esse problema. Foi um erro do usuário.

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

Acima você pode ver a saída de type -a. Originalmente, criei um alias que usava um subscrito e, quando isso não funcionou, tentei criar um link simbólico para o executável, tentei diferentes aliases e tentei criar o script mencionado acima. No entanto, nada disso funcionou porque toda vez que eu fazia uma alteração, .bashrceu executava

$ source .bashrc

Eu não sabia que isso sourcenão substituiria meu johnalias original ... Como os aliases têm precedência sobre a $PATHvariável, esse tempo todo johnestava executando o mesmo subshell original que não aceitava argumentos. Ao executar unalias john, agora tudo funciona.

OBSERVAÇÃOQuando se trata de fazer um link simbólico no /usr/local/bin, concordo que esta seria uma alternativa melhor, mas infelizmente não funciona nesta situação, como você pode ver na saída a seguir:

$ 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

informação relacionada