-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46567
- shell命令
-
- 文章:(42)篇
- 阅读:154240
- Git教程
-
- 文章:(36)篇
- 阅读:234857
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131804
-
linux中添加用户自定义的命令2017-10-17 10:28 阅读(12563) 评论(0)
一、问题
在linux中,我们往往希望某个命令是全局的,比如我想以命令行的方式,调试某个程序,很多的时候,我们是通过如下方式实现:
/usr/local/php/bin/php index.php
在如,在自己的家目录的bin目录下创建了一个shell脚本,每次我们通过以下方式去执行
~/bin/open_redis.sh
没有想过,为什么我们不去通过如下方式运行呢?
php index.php //测试index.php程序 open_redis //打开redis
想是想,但是报错zsh: command not found
通过报错,我们可以得知是因为找不到这个命令,那么如果我们添加这个命令,让程序可以找到不就可行了。
二、linux系统如何判断某个命令是否存在
在添加命令之前,我们首先得了解,linux是怎样查找某个命令是否存在呢?
我们可以回想,在windows里的命令提示窗口中的操作,如果我们输入某个命令提示“不是内部或外部命令,也不是可运行的程序或批处理文件”,我们会怎么做呢?当然是配置环境变量path的路径了。
其实,linux也是这个道理,查找命令也是依赖于环境变量path,如下:
如果不是系统内部命令,linux也会依赖path去查找命令。那么当我们将某个命令放到path变量中的某目录下面,也就能够查找到该命令,自然就会运行成功。
譬如,因为我path变量中,保存了go命令所在目录,所以可以直接使用go的相关命令,如下
三、linux中何如修改path的路径呢?
最简单的方式,就是直接在命令行里修改path变量的值,如下
PATH=/usr/local/bin:/bin:/usr/bin:/home/dequan/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/lib/jvm/jre-1.8.0-openjdk.i386/bin:~/bin
但是,这种修改是临时的,每当退出后重新连接,上次的修改就会失效。为什么会失效呢?因为每次登录上linux,都会重新设置path变量,那么咱们就去了解一点linux的登录过程。
首先去执行了/etc/profile 文件里面的内容。
接着得看当前用户的shell类型,来执行不同的内容。
若当前shell为Bash,那么接下来会执行
~/.bash_profile、~/.bash_login或 ~/.bashrc文件中的其中一个 ,因为我当前系统是centos6.5,执行的是~/.bashrc文件。如下
其中,.bash_logout是在断开连接的时候执行;~/.bashrc当登录时以及每次打开新的shell时,该该文件被读取;~/.bash_profile文件仅仅在用户登录时,执行一次。
所以,我们可以把自定义的命令需要在~/.profile文件中,其实,别名设置也是在这个文件中。如下:
四、linux中添加自定义命令
在~/test目录下添加一个文件redis.sh,内容如下:
# ~/.bash_logout echo "连接redis"
当然,若此时执行redis.sh,肯定会报错
因为在$PATH变量对应的目录中找不到redis变量,此时,我们有两种方式解决,如下:
1.通过设置别名
因为我当前连接用户使用的zsh,所以需要修改~/.zshrc,若为bash,则需要修改.bashrc文件。查看当前shell类型如下:
在~/.zshrc中添加如下代码:
alias redis="~/test/redis"
此时,就可以顺利执行redis命令了。
2.通过设置path
如果有很多命令,每次都去设置一个别名,是不是觉得很麻烦。既然有麻烦,那么linux肯定是提供了解决方案的。那就是设置path,path对应的目录下面的命令就可以直接运行了。
比如我想让~/test目录下的所有命令都可以直接运行,需要在~/.zshrc中设置,如下:
export PATH="$PATH:/home/dequan/test"