很多时候,我想要执行的脚本不在我当前的工作目录中,而且我也不想离开它。
从另一个目录运行脚本(BASH、Perl 等)是一种好习惯吗?它们通常会找到正确运行所需的所有内容吗?
如果是这样,运行“远程”脚本的最佳方法是什么?
. /path/to/script
或者
sh /path/to/script
在这种情况下如何使用sudo
?例如,这个不起作用:
sudo . /path/to/script
答案1
sh /path/to/script 将生成一个新的 shell 并独立于当前 shell 运行脚本。source
(.) 命令将在当前 shell 中调用脚本中的所有命令。例如,如果脚本恰好调用exit
,那么您将丢失当前 shell。因此,使用 sh 在单独的 shell 中调用脚本或使用完整路径(以 开头/
)或相对路径(./
)将它们作为二进制文件执行通常更安全。如果作为二进制文件调用,它们将使用指定的解释器执行(#!/bin/bash
例如)。
至于要知道脚本是否能找到所需的文件,除了查看脚本以了解其功能外,没有其他好的答案。作为一种选择,您可以随时在子进程中转到脚本的文件夹,而无需离开当前文件夹:
(cd /wherever/ ; sh script.sh)
答案2
您绝对可以做到这一点(使用其他人提到的调整,例如sudo sh /pathto/script.sh
或./script.sh
)。但是,我做了几件事之一来在系统范围内运行它们,这样就不用担心目录并节省了我无用的额外输入。
1)符号链接到/usr/bin
ln -s /home/username/Scripts/name.sh /usr/bin/name
(确保那里没有重叠的名称,因为您显然会覆盖它。)这也让我可以将它们保存在我的开发文件夹中,以便我可以根据需要进行调整。
2)将脚本目录添加到你的路径(使用 .bash_profile - 或者你 shell 上的任何 .profile)
PATH=/path/to/scripts/:$PATH
3)在创建别名中.bash_profile
添加~/.bash_profile
如下内容:
alias l="ls -l"
正如您所看到的,语法只是别名、数字、您想要充当的命令、命令。因此,在终端的任何地方输入“l”都会导致ls -l
如果您想要 sudo,只需alias sl="sudo ls -l"
记住 l vs sl(作为一个无用的例子)。
无论哪种方式,你都可以直接输入sudo nameofscript
并继续。无需乱用 ./ 或 . 或 sh 等。只需先将它们标记为可执行文件即可 :D
答案3
我通常像你说的那样
sh /path/to/script
并以 root/超级用户身份运行它
sudo sh /path/to/script
仅当脚本假定您与当前目录位于同一文件夹中时,当前目录才重要。我认为大多数脚本不会这样做,您可以像上面一样保存并运行它。
答案4
如果您有需要经常运行的脚本,并且它们依赖于其位置来查找资源,那么您可以通过像这样组合别名中的命令来轻松完成此操作。
alias run-script="cd /home/user/path/to/script/ && bash script.sh"
这样,您不需要改变任何其他东西就可以使其工作。