Mac的控制台命令无法使用command not found

发布于 2019-10-24 12:55:57 阅读 193

起因

今天我准备在.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

WX20191024-110829.png

这是我的电脑输出的结果。path=后面是用:冒号隔开

因为PATH的目录表示的是可执行的命令的集合,如果要执行ls,那么shell就会挨个从PATH目录中的第一个目录寻找,第一个目录没有就去第二个找,然后都没有找到,就返回command not found字样。

很显然本次修改是把PATH的目录直接改成了~/my/folder/address而这个目录下面没有任何可执行的命令。

我们可以找一下这个ls命令在哪个PATH目录下

WX20191024-111905.png

找到了,在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目录中了。