Answers:
sh / path / to / script将产生一个新的shell并独立于您当前的shell运行脚本。在source
()命令将在脚本中调用的所有命令在当前shell。exit
例如,如果脚本恰好调用,那么您将丢失当前的shell。因此,通常更安全的做法是使用sh在单独的外壳中调用脚本,或者使用完整(以/开头)或相对路径(./)作为二进制文件执行脚本。如果作为二进制文件调用,它们将使用指定的解释器(例如,#!/ bin / bash)执行。
至于知道脚本是否可以找到所需的文件,除了查看脚本以了解其作用外,没有什么好的答案。作为一种选择,您始终可以在子流程中转到脚本的文件夹,而无需离开当前文件夹:
$(cd /wherever/ ; sh script.sh)
(cd /wherever/ ; sh script.sh)
吗 你为什么要$
在前面?
您绝对可以做到这一点(通过其他类似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
我通常将脚本保存在/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
。
不知道为什么没人建议这个,但是这很简单!我已经用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秒钟的时间进行设置。
希望这对某人有所帮助。
古老的问题,但永恒的问题。
我一直看到的解决方案是拥有一个$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
bin
目录中?那看起来很麻烦。(3)而且,它破坏了位置独立性。如果/home/desmond/bin/foo
是指向我的脚本的链接,BASH_SOURCE
则将为/home/desmond/bin/foo
,并且该脚本将无法找到其资源。
/bin
或在中的已知位置/opt
。(3)位置独立性正是在编写相互依赖的个人脚本集合时保留的内容。
. /path/to/script
源脚本!如果只想运行它,则根本不需要该时间段。