从另一个目录运行脚本

从另一个目录运行脚本

很多时候,我想要执行的脚本不在我当前的工作目录中,而且我也不想离开它。

从另一个目录运行脚本(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"

这样,您不需要改变任何其他东西就可以使其工作。

相关内容