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)
您绝对可以这样做(通过其他人提到的调整,例如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
我通常会像你说的那样
sh /path/to/script
Run Code Online (Sandbox Code Playgroud)
并以 root/超级用户身份运行它
sudo sh /path/to/script
Run Code Online (Sandbox Code Playgroud)
仅当脚本假定您与当前目录位于同一文件夹中时,您的当前目录才有意义。我假设大多数脚本不会执行此操作,并且您可以像上面一样运行它。