![为什么我的 shell 脚本从 PATH 运行时不接受参数?](https://linux22.com/image/1585512/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%20shell%20%E8%84%9A%E6%9C%AC%E4%BB%8E%20PATH%20%E8%BF%90%E8%A1%8C%E6%97%B6%E4%B8%8D%E6%8E%A5%E5%8F%97%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我刚刚编译了一个名为开膛手约翰。目前,如果我想运行,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
这Kamil Maciorowski 的评论帮我解决了这个问题。这是用户错误。
$ 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,该子 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