為什麼我的 shell 腳本在從 PATH 執行時不接受參數?

為什麼我的 shell 腳本在從 PATH 執行時不接受參數?

我剛剛編譯了一個名為的程式的源代碼開膛手約翰。目前,如果我想運行,john我必須cd進入該run/目錄並使用./john.但是,我更希望能夠john從任何目錄運行該命令,就像它安裝在系統範圍內一樣。我無法為此創建別名,因為我需要能夠將參數傳遞給二進位檔案。所以我嘗試寫一個小的 shell 腳本。

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

為什麼會這樣呢?為什麼命令列參數沒有傳遞到我的 shell 腳本?如何設定它以便我可以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都在執行相同的原始子 shell,不會接受參數。通過運行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

相關內容