[linux]bash和zsh的区别与联系

573 阅读2分钟

参考网址

blog.csdn.net/qq_40520596…

二者之间的比较

zsh越来越受更多人的欢迎,号称终极"shell".
从一个交互式终端的角度来看,zsh更加强大,而bash更符合posix标准,因此bash更加适合做脚本解释器。

bash上手快,基本直接就可以使用,但是zsh则需要繁杂的配置(还需要用到 oh-my-zsh),具体配置在后面讲述;

zsh有几大特点明显优于bash,具体特点如下:
① 色彩高亮、拼写检查:
     根据你输入的内容来判断颜色种类,例如:白色代表普通命令或者程序内容,红色代表错误命令等;
       
② 命令提示:
     这个可以说是最方便的功能,输入某命令后,后面就用灰色给你提示该命令的参数,随着动态不断输入,提示还会根据内容不断更新;
       
③ 智能补全:
     传统shell的补全功能在zsh面前则是黯淡无光,尤其是在长路径切换的时候,不用像bash一样持续提示你需要继续输入,只用连续敲击两次 TAB 键 zsh 给你一个补全目录,让你来进行选择。

如何配置zsh

安装zsh
  sudo apt-get install zsh

把默认的Shell改成zsh
  chsh -s /bin/zsh
  注意:不要使用sudo。

如果总是报 chsh: PAM: Authentication failure, 则需配置密码文件,解决chsh: PAM认证失败的问题
  sudo vim /etc/passwd
  把第一行的/bin/bash改成/bin/zsh,这个是root用户的。
  把当前用户的/bin/bash改成/bin/zsh,一般安装后默认已经是zsh。

安装oh-my-zsh
  git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

查看当前linux系统可以使用的shell

cat /etc/shells

输出:
  # /etc/shells: valid login shells
    /bin/sh
    /bin/bash
    /usr/bin/bash
    /bin/rbash
    /usr/bin/rbash
    /bin/dash
    /usr/bin/dash
    /bin/zsh
    /usr/bin/zsh

查看当前使用的shell是啥

 一、最常用的查看shell的命令,但不能实时反映当前shell
    echo $SHELL   # echo在linxu中,就相当于python中的print()
    
    ```
    /usr/bin/zsh
    ```

二、下面这个用法并不是所有shell都支持
    echo $0
    ```
    -zsh
    ```

三、环境变量中shell的匹配查找
    env | grep SHELL
    ```
    SHELL=/usr/bin/zsh
    ```

四、口令文件中shell的匹配查找
    cat /etc/passwd | grep root
    ```
    root:x:0:0:root:/root:/usr/bin/zsh
    ```

五、查看当前进程
    ps
    ```
        PID TTY          TIME CMD
     377834 pts/1    00:00:00 zsh
     377874 pts/1    00:00:00 ps
    ```

六、先查看当前shell的pid,再定位到此shell进程\
    echo $$
    ```
    377834
    ```

ps -ef | grep 377834

```
root      377834  377800  0 07:17 pts/1    00:00:00 -zsh
root      377879  377834  0 07:24 pts/1    00:00:00 ps -ef
root      377880  377834  0 07:24 pts/1    00:00:00 grep 377834
```

附:一条命令即可实现:
ps -ef | grep `echo $$` | grep -v grep | grep -v ps
```
root      377834  377800  0 07:17 pts/1    00:00:00 -zsh
```

七、输入一条不存的命令,查看出错的shell提示
tom
```
zsh: tom: command not found
```