PATH から実行したときにシェル スクリプトが引数を受け入れないのはなぜですか?

PATH から実行したときにシェル スクリプトが引数を受け入れないのはなぜですか?

私は今、というプログラムのソースコードをコンパイルしました。ジョン・ザ・リッパー現時点では、 を実行したい場合は、ディレクトリに移動しjohnてで実行する必要があります。ただし、システム全体にインストールされているかのように、任意のディレクトリからコマンドを実行できる方がはるかに望ましいです。バイナリにパラメータを渡す必要があるため、これにはエイリアスを作成できません。そこで、小さなシェル スクリプトを作成してみました。cdrun/./johnjohn

#!/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

カミル・マチオロウスキーのコメントこの問題の解決に役立ちました。ユーザーエラーでした。

$ 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

関連情報