起因
今天我准备在.zshrc
中换我的gopath
路径,然后写成了export PATH=~/my/folder/address
【正确的写法是export GOPATH=~/my/folder/address
】
执行完source ~/.zhsrc
,后就出现ls : command not found
,我想要重新修改.zshrc
文件,vim
也提示command not found
怎么办呢?
解决
我们先在终端中执行
export PATH=/usr/bin:/usr/sbin:/bin:/sbin
然后vim .zshrc
在文本编辑器中将刚刚手贱改错的命令改成正确的,然后source ~/.zshrc
即可。
所以为什么我改了PATH
的地址就出现ls
这种基本的命令都没法执行呢?
分析
首先我们先试着echo $PATH
这是我的电脑输出的结果。path=后面是用:
冒号隔开
因为PATH
的目录表示的是可执行的命令的集合,如果要执行ls,那么shell就会挨个从PATH目录中的第一个目录寻找,第一个目录没有就去第二个找,然后都没有找到,就返回command not found
字样。
很显然本次修改是把PATH的目录直接改成了~/my/folder/address
而这个目录下面没有任何可执行的命令。
我们可以找一下这个ls命令在哪个PATH目录下
找到了,在bin目录下,当然我们还看到了这个bin目录下还有我们经常用的其他命令,比如cp、mv、rm、chmod等命令。
那我们执行export PATH=/usr/bin:/usr/sbin:/bin:/sbin
后咋就ls命令又好使了呢?
在上面我们编辑过.zshrc
后执行的是source ~/.zshrc
这个source的作用就是让刚刚我们改的~/.zshrc这里的配置立即生效,当我们开启一个新的终端时,刚刚改的配置也是生效的。
而在终端中直接运行export PATH时,仅仅对于当前的终端有效,此时ls执行是有效的,但是如果退出这个终端,那么command not found又回来了。
所以我们利用这个特点,在当前终端执行export PATH=/usr/bin:/usr/sbin:/bin:/sbin
,然后重新vim,然后source即可。
扩展
如果我们新创建了一个可执行文件,而我不想cd到某个目录,然后执行,我想要全局执行怎么办呢?这边有两种方法:
一个是将这个可执行文件拷贝到我们的$PATH目录中,这种方法有一个问题就是我可能经常重新编译这个可执行文件,我每次编译都需要将这个可执行文件拷贝到$PATH目录中。
第二种方法就是把这个目录加入到$PATH中,当然我们需要用冒号分割,比如这样export PATH=$PATH:~/my/exec/folder
,这样我们就不需要每次编译后都移动文件到某个$PATH
目录中了。