如何在没有完整路径的情况下从终端的任何位置运行应用程序

如何在没有完整路径的情况下从终端的任何位置运行应用程序

我有一个应用程序,可以在文件位置运行,如下所示:

-$ cd home/myApps/app
-$ ./run.sh

我想从终端的任何位置调用 run.sh,而无需完整路径,我尝试使用 alais 并将以下代码添加到 bashrc 文件中。

alias mylovleyapp=/home/myApps/app/run.sh

问题是每当我想使用 mylovleyapp 运行应用程序时,程序都会返回错误,因为 run.sh 依赖于 myApps 文件夹中的另一个文件

我怎样才能实现这个目标?

答案1

条条大路通罗马。

别名

如果您喜欢别名,您可以按如下方式操作:

alias mylovleyapp='(cd home/myApps/app && ./run.sh)'

括号(...)使这两个命令在子 shell 中运行。因此,程序结束后,当前目录不会发生变化。

PATH 中的包装脚本

相反,您可以创建一个包装脚本并将其放在您搜索的文件夹中PATH,例如~/.local/bin~/bin如果您是唯一需要访问权限的用户,或者/usr/local/bin所有用户都需要访问权限。然后,您只需键入脚本的名称即可启动该程序。

该脚本可以只是您通常启动程序时所做的事情:

#!/usr/bin/env bash
cd home/myApps/app
./run.sh

例如,将该脚本另存为~/.local/bin/mylovleyapp。使脚本可执行,以便可以运行:

chmod +x ~/.local/bin/mylovleyapp

如果~/.local/bin不存在,您必须创建它,然后注销并重新登录以将其自动包含在您的 中PATH。从现在开始,只需mylovleyapp在终端中输入即可运行您的应用程序。

答案2

因为楼主没有提供示例脚本,所以我打算自己写一个。它只做一件事。ls在脚本目录中运行。

是的,我知道你可以不用ls./但是对于这个例子,我假装它是必需的,以演示使用脚本当前目录的脚本。

#!/usr/bin/env bash
ls ./

将该脚本保存在某处。我将其保存为/home/ubuntu/test/myscript。使用 使其可执行chmod +x /home/ubuntu/test/myscript。现在cd到脚本所在的目录(例如cd /home/ubuntu/test),并使用 运行该脚本./myscript

ubuntu@computer:~/test$ ./myscript
myscript someRandomFile

到目前为止一切顺利。但现在让我们从不同的目录运行它。在这个例子中,我将从根目录 ( /) 运行它。

ubuntu@computer:~/test$ cd /
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin  dev home lib   lib64  lost+found mnt proc run  snap sys usr
boot etc init lib32 libx32 media      opt root sbin srv  tmp var

哎呀。我们希望它打印脚本位置的文件,而不是用户位置的文件。在我们找到解决方案之前,请考虑一下为什么它会这样做一会儿。答案很简单。./是相对于用户的当前目录,而不是脚本目录。

为了从脚本内部获取脚本的目录,我们将查看这个 Stack Overflow 问题

它的要点很简单:script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"将获取脚本的当前目录,并将其存储在变量中script_dir

让我们相应地更新脚本。我们的脚本现在是这样的:

#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"

让我们运行它,看看它是否有效:

ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile

成功了!即使您不在脚本所在的目录中,它也会打印脚本目录中的文件,我们完成了。总体思路很简单。在脚本中,./指的是用户的目录。"$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"指的是脚本所在的目录。相应地更新您的脚本,它应该可以正常工作。

答案3

您需要将应用程序路径添加到 PATH 变量中。要临时执行此操作,请转到应用程序所在的目录,然后:

PATH=.:$PATH

现在您可以从任何地方调用您的应用,而无需输入其完整路径。如果您关闭终端,此设置将会丢失。

要永久设置它,您需要编辑 .bashrc 文件并将 :/home/myApps/app 添加到 PATH 末尾。保存新的 .bashrc 文件,然后:

source .bashrc

答案4

因此,您需要将工作目录更改为目标应用程序所在的目录,然后执行该应用程序,以便它可以找到依赖文件。

我认为您可以通过在别名中给出两个单独的命令来实现这一点:一个用于更改目录,另一个用于执行程序,用分号分隔。

因此你的.bashrc补充内容应为:

alias mylovleyapp='cd /home/myApps/app; ./run.sh'

假设依赖文件在/home/myApps/app...如果不是,那么您可以将工作目录更改为包含依赖文件的目录,然后使用绝对路径作为第二个组件运行该应用程序。

相关内容