将Bash脚本添加到路径中

56

我希望将一个小脚本添加到Linux的PATH中,这样我就不必在磁盘上实际运行它。

这个脚本非常简单,是为了让apt-get通过我制作的代理访问,我做成了这样:

#!/bin/bash
array=( $@ )
len=${#array[@]}
_args=${array[@]:1:$len}
sudo http_proxy="http://user:password@server:port" apt-get $_args

然后我将其保存为apt-proxy.sh,设置为+ x(chmod),并且当我在放置该文件的目录中时,一切都正常工作。

我的问题是:如何将此 apt-proxy 添加到 PATH 中,以便我实际上可以从任何地方调用它,就像真正的apt-get一样?

只寻找命令行解决方案,如果您知道如何通过GUI进行操作,那很好,但不是我要找的


2
sudo ... apt-get "${@:2}""可能比尝试构建第二个数组更简单、更健壮。 - chepner
根据您的需求/选项,将PATH指向脚本(已在答案中详细说明)或将脚本移动到已有位置都可以实现所需的结果。我通常会将脚本放在/usr/local/bin中。 - Origineil
谢谢@chepner,我是bash编程的新手,所以我很感激这样的建议来改进我的代码。 - Mansueli
5个回答

95
尝试以下操作:
  • 将脚本另存为apt-proxy(不要带.sh扩展名)到某个目录,比如~/bin
  • ~/bin添加到您的PATH中,输入export PATH=$PATH:~/bin
  • 如果您需要永久使用,请将该最后一行添加到您的~/.bashrc文件中。如果您正在使用zsh,则请改为添加到~/.zshrc中。
  • 然后,您只需使用参数运行apt-proxy即可在任何地方运行。

请注意,如果您在特定窗口中export了PATH变量,则其他bash实例中不会更新。


4
你不需要导出 PATH,因为它很可能已经被标记为导出。此外,最好是将你的个人路径添加到现有的 PATH 前面而不是后面。 - gniourf_gniourf
2
@gniourf_gniourf 为什么在编程中使用前置更好? - compguy24
12
如果你在dirAdirB目录下都有一个可执行文件my_command,并且你的PATH设置为PATH=dirA:dirB,那么dirA中的my_command将被优先找到并运行。通常,个人的可执行文件是用来覆盖系统级别的文件的,这就是为什么通常最好将个人文件夹放在PATH的前面的原因。 - gniourf_gniourf
请注意,zsh 可能无法正确识别 ~。您可以使用绝对路径或 $HOME 代替。 - Ali Ghanavatian

11
你想把那个目录定义到路径变量中,而不是实际的二进制文件。
PATH=$MYDIR:$PATH

其中MYDIR被定义为包含二进制文件的目录,例如:

PATH=/Users/username/bin:$PATH

你应该将这个脚本放在你的启动脚本中,例如 .bashrc,以便它每次调用shell进程时都会运行。

请注意顺序很重要,并且PATH被评估为如果在路径变量的早期条目中找到与您的名称匹配的脚本,则您将执行该脚本。因此,您可以将脚本命名为apt-get并将其放置在路径中较早的位置。我不建议这样做,因为这很容易造成混淆。你可能想要尝试使用shell别名。

我还注意到你说它从当前目录正常工作。如果你的意思是你在你的路径中有当前目录(.),那么这可能存在安全风险。某人可以将一些特洛伊木马变种的常见实用程序(例如ls)放在一个目录中,然后让你cd到该目录并无意中运行它。


你可能想看一下这两个详细的答案,一个在unix.stackexchange.com,另一个在superuser.com - Iam Zesh

1
作为最后一步,在按照@jlhonora提出的解决方案(https://dev59.com/a2Ij5IYBdhLWcg3wn2do#20054809)的形式进行操作后,更改“~/bin”文件夹中文件的权限。您可以使用以下命令:
chmod -R 755 ~/bin

0

在~/.bash_profile文件中创建可执行文件的别名,然后您可以从任何地方使用它,或者您可以源自包含需要运行的可执行文件的目录,并且这将为您解决问题。


0
添加到@jlhonora 你在~./bashrc或~./zshrc所做的更改在你执行以下操作之前不会生效:source ~./zshrcsource ./bashrc ,或重新启动你的电脑。

这可以作为他回答中的一条评论。你也可以编辑他的回答并加入这个内容。 - Mansueli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接