从另一个目录运行脚本


11

通常,我要执行的脚本不在我当前的工作目录中,并且我真的不想离开它。

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

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

. /path/to/script

要么

sh /path/to/script

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

sudo . /path/to/script

请注意,. /path/to/script 脚本!如果只想运行它,则根本不需要该时间段。
gniourf_gniourf 2012年

Answers:


14

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

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

$(cd /wherever/ ; sh script.sh)

3
你是说(cd /wherever/ ; sh script.sh)吗 你为什么要$在前面?
G-Man说'恢复莫妮卡'

7

您绝对可以做到这一点(通过其他类似sudo sh /pathto/script.sh或的调整./script.sh)。但是,我要做一些事情来在全系统范围内运行它们,而不用担心目录问题并节省我不必要的额外输入。

1)符号链接到 /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name

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

2)将Scripts目录添加到您的路径(使用.bash_profile-或您在shell中拥有的what.profile)

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

3)在中创建Alias .bash_profile~/.bash_profile添加类似以下内容:

alias l="ls -l"

如您所知,语法只是别名,即您要用作命令的数字,即命令。因此,在终端的任何地方键入“ l”将导致ls -l 如果您想使用sudo,alias sl="sudo ls -l"请注意一下l vs sl(作为无用的示例)。

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


我强烈建议您选择选项
Bernhard

为什么?这是最佳做法还是仅是品尝?
塞尔吉奥2014年

3

我通常喜欢你说的

sh /path/to/script

并以root / superuser身份运行

sudo sh /path/to/script

仅当脚本假定您与其位于同一文件夹时,当前目录才有意义。我认为大多数脚本都不会这样做,因此您可以像上面那样运行它。


不工作,如果是secure_path在/ etc / sudoers文件中设置
l1zard

3

我通常将脚本保存在/usr/local/bin/usr/local/sbin/(如果脚本需要root特权)中,根据文件系统层次结构标准(FHS),它们属于。

您要做的就是确保将这两个目录添加到您的中PATH。您可以通过编辑$HOME/.bashrc文件并添加以下行来做到这一点:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

如果您希望能够以root用户身份执行脚本sudo,则必须将这些目录添加到变量secure_path/etc/sudoers

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

通过运行该文件来完成编辑visudo,以确保您没有任何错误。


错别字:您的意思.bashrc不是.bachrc
gniourf_gniourf 2012年

0

我不确定它是否可以在linux中这样工作,假设没有人建议的话它不会。但是不要使用././返回目录。您可以使用引号为它提供绝对路径吗?也许它并不能使您完全了解整个驱动器。


0

如果您有需要经常运行的脚本,并且它们依赖于它们的位置来查找资源,则只需在别名中组合命令即可轻松地做到这一点。

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

这样,您无需进行任何其他更改即可使其工作。


0

不知道为什么没人建议这个,但是这很简单!我已经用Google搜索了几次,却找不到我给出的确切答案,因此我以为可以分享。IMO,无论如何,对我而言,这是最好的解决方案,也是最简单的解决方案,但是其他人可能会有不同的感受和做事。

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

首先,“ cd”命令告诉它脚本位置的目录。然后是“ &&”,这样您就可以在执行下一个命令后将其绑定。最后,就像在终端中执行脚本一样打开脚本!将您的内容保存在BASH文件中,需要5秒钟的时间进行设置。

希望这对某人有所帮助。


-1

古老的问题,但永恒的问题。

我一直看到的解决方案是拥有一个$HOME/bin目录,然后将其放在第一个目录中$PATH~/.bashrc如果尚不存在,~/bin$PATH默认为第一个)。在其中放置脚本以执行或与其他位置的脚本/可执行文件建立符号链接是处理不影响系统或其他用户的路径问题的简单方法。

如果脚本需要相对于其自身位置(并非罕见)可以找到的其他资源,则使用envvar $BASH_SOURCE$BASH_SOURCE始终包含当前运行脚本本身的绝对路径,而不管的值$PWD

考虑以下:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

因此,我们可以看到这$HOME/bin是第一个$PATH,因此无论我输入什么都~/bin可以运行。我有一个名为的演示脚本~/bin/findme

#!/bin/bash

echo "Running from $BASH_SOURCE"

这可以用来获取运行脚本位置的绝对路径。

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme

(1)虽然这似乎是有用的信息,但问题并没有询问如何编写相对于其自身位置使用资源的脚本;它询问有关运行脚本的信息。(2)我不确定您的第二段如何解决这个问题。您是否建议,如果我编写脚本并且Desmond要运行它,他应该将其链接到他的私有bin目录中?那看起来很麻烦。(3)而且,它破坏了位置独立性。如果/home/desmond/bin/foo是指向我的脚本的链接,BASH_SOURCE则将为/home/desmond/bin/foo,并且该脚本将无法找到其资源。
G-Man说'恢复莫妮卡''18

@ G-Man(1)用户没有提供太多上下文。在过去的30年中,每当有人问我这个问题时,总是会出现这样的情况:用户(通常是新的sysop或开发人员)运行自己的脚本和其他获得的脚本来自动执行琐碎的任务,因此我回答了道路。这确实假定了用户询问方面的一些脚本知识。(2)系统范围的脚本通常安装在中/bin或在中的已知位置/opt。(3)位置独立性正是在编写相互依赖的个人脚本集合时保留的内容。
zxq9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.