这个话题已经被讨论过,但我读过的每一篇文章都让我更加困惑。
例如,采用名为 test 的简单 bash hello world 脚本。我以用户 Bill 的身份创建了它,并执行了chmod 755 test
使其可执行。该脚本位于/home/Bill/scripts
并且我尝试进行导出PATH=$PATH:/home/Bill/scripts
当我在该目录中时,我可以使用./test
.但是如果我退出,/home/Bill
我会得到一个“-bash:./test:没有文件或目录”
如果我切换到根目录,即使我已将其添加到我的环境路径中或者我认为我使用了导出命令,我也找不到该脚本。
我还读到,我可以将脚本路径添加到我的脚本中/etc/sudoers
,并且不需要密码,但这需要用户运行sudo ./test
.有没有办法让这个脚本可以从任何地方的任何用户普遍访问和执行?
./test
另一方面,我对test
我创建的脚本与我创建的脚本之间的区别感到有点困惑,test
但是当我或任何其他用户运行它时,他们会运行它还是./test
只是运行它test
答案1
您可以通过指定脚本的路径(相对或绝对)或确保包含脚本的目录位于 shell 的搜索中来执行脚本$PATH
。
暂时忽略这个示例的名称不太好这一事实,因为您的 shell 可能会选择执行test
其他脚本,如果包含的目录位于您的.这就是你所做的。在设置了此项的终端中,无论当前工作目录如何,都可以执行。test
test
$PATH
export PATH=$PATH:/home/Bill/scripts
$PATH
test
如果脚本是不是在你的$PATH
, 或者你想明确指定哪个 test
如果要执行,您不仅可以提供文件名,还可以提供文件的相对或绝对路径。因此,无论您当前的工作目录如何,您始终可以通过提供完整路径来执行脚本:/home/Bill/scripts/test
。
您还可以通过提供相对路径来执行脚本;对于一些示例,其中提示符指示您的工作目录:
/home/Bill/scripts$ ./test
/home/Bill$ scripts/test
/home/Bill/documents$ ../scripts/test
/home/James/documents$ ../../Bill/scripts/test
当您尝试执行时收到错误的原因
/home/Bill$ ./test
是因为没有文件/home/Bill/test
,这就是您要执行的文件(“test
当前目录中的文件.
”)
如果您希望所有用户都能够仅使用脚本名称来运行脚本,而不需要提供脚本的绝对或相对路径,则它必须位于每个人的$PATH
.您可以通过让每个用户添加/home/Bill/scripts
到他们的$PATH
,或者将脚本放在所有用户的默认位置$PATH
(例如 )来完成此操作/usr/local/bin
。但是您必须将脚本命名为 以外的名称test
,因为这test
是一种特殊情况:它是 shell 内置命令。
答案2
将脚本命名为“test”并不是一个好主意,因为已经有一个“test”命令:
型式试验 test 是 shell 内置的
除此之外,PATH 变量始终可以查找程序或脚本。因此,将脚本的路径放入 PATH 中
导出 PATH=/your/place/to/directory_of_script:$PATH
将使您的脚本易于访问。但不要使用 shell 内置名称或其他已经存在的程序或脚本名称!