从另一个目录运行脚本

Des*_*ume 21 linux script bash shell command-line

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

从另一个目录运行脚本(BASH、Perl 等)是一个好习惯吗?他们通常会找到正常运行所需的所有东西吗?

如果是这样,运行“远程”脚本的最佳方法是什么?是吗

. /path/to/script
Run Code Online (Sandbox Code Playgroud)

或者

sh /path/to/script
Run Code Online (Sandbox Code Playgroud)

以及sudo在这种情况下如何使用?例如,这不起作用:

sudo . /path/to/script
Run Code Online (Sandbox Code Playgroud)

Яро*_*лин 22

sh /path/to/script 将产生一个新的 shell 并独立于当前的 shell 运行她的脚本。在source()命令将在脚本中调用的所有命令在当前shell。exit例如,如果脚本碰巧调用,那么您将丢失当前的 shell。因此,使用 sh 在单独的 shell 中调用脚本或使用完整(以 开头/)或相对路径 ( ./)作为二进制文件执行它们通常更安全。如果作为二进制文件调用,它们将使用指定的解释器(#!/bin/bash例如)执行。

至于知道脚本是否会找到它需要的文件,没有很好的答案,除了看脚本看看它做了什么。作为一种选择,您始终可以在子流程中转到脚本的文件夹,而无需离开当前文件夹:

(cd /wherever/ ; sh script.sh)
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是`(cd /wherever/ ; sh script.sh)`吗?为什么前面有一个`$`? (4认同)

ner*_*ler 8

您绝对可以这样做(通过其他人提到的调整,例如sudo sh /pathto/script.sh./script.sh)。但是,我做了一些事情之一来在系统范围内运行它们,而不用担心目录并节省我无用的额外输入。

1) 符号链接到 /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name
Run Code Online (Sandbox Code Playgroud)

(确保那里没有重叠的名称,因为您显然会覆盖它。)这也让我可以将它们保存在我的开发文件夹中,以便我可以根据需要进行调整。

2) 将 Scripts 目录添加到您的路径中(使用 .bash_profile - 或您外壳上的任何.profile)

PATH=/path/to/scripts/:$PATH

3).bash_profile~/.bash_profile添加中创建别名,例如:

alias l="ls -l"
Run Code Online (Sandbox Code Playgroud)

如您所知,语法只是别名,您想要充当命令的数字,即命令。所以在终端的任何地方输入“l”会导致ls -l 如果你想要 sudo,只是alias sl="sudo ls -l"为了提醒自己 l vs sl(作为一个无用的例子)。

无论哪种方式,您都可以打字sudo nameofscript并继续前进。无需弄乱 ./ 或 . 或 sh 等。只需首先将它们标记为可执行文件:D


Bol*_*lli 6

我通常会像你说的那样

sh /path/to/script
Run Code Online (Sandbox Code Playgroud)

并以 root/超级用户身份运行它

sudo sh /path/to/script
Run Code Online (Sandbox Code Playgroud)

仅当脚本假定您与当前目录位于同一文件夹中时,您的当前目录才有意义。我假设大多数脚本不会执行此操作,并且您可以像上面一样运行它。