linux使用zsh的一些问题
zsh 搭配 oh-my-zsh 一起食用的方式和好处不多说了,这篇主要记录下遇到的问题(不是 zsh 的, 是对 shell 的不熟悉导致的使用问题).
最近学习编译嵌入式 linux 时一直使用的 zsh (在本地电脑上), 然后跑一个脚本时直接退出了终端, 同样的错误参数在服务器上也是会断开连接, 但是正确的参数在本地会报错, 服务器上却一切正常. 看得我一脸懵逼, 最后弄明白好几个点, 记录一下降低以后再次忘记的概率 =. =
本地用的 wsl2(ubuntu20.04) 和 zsh, 服务器是 ubuntu16.04 和 bash. 这里是几个不同的问题混在了一起, 一个个看.
PART1: source 调用和 直接运行的区别
首先应该是错误的参数导致脚本里调用了 exit 而退出, 但是换种方式却不会退出, 这个以前用过, 好久没深入使用 shell 又忘记了…
方式一: 当使用 source yourShell.sh
或者 . yourShell.sh
运行脚本时是直接在当前进程中读取脚本配置, 且其内容会影响到当前环境, 比如脚本中的一些变量以及 exit 时会直接退出当前终端.
方式二: 直接 ./yourShell.sh
, bash yourShell.sh
, zsh yourShell.sh
等运行时会新建一个进程运行脚本, exit 也只是退出这个新建的进程, 不会影响到当前进程的环境. 验证方式也很简单, 在脚本中添加
|
|
再次运行可查看脚本运行的进程 id 和 父进程 id.
PART2: 脚本第一行 #!/bin/bash 的作用
方式二中 bash yourShell.sh
, zsh yourShell.sh
很好理解, 前者用 bash 解释运行当前脚本, 后者使用 zsh, 不同的 shell 会有一些区别, 比如 if [$VAR1 == $VAR2]
在 bash 中可运行, 在 zsh 中却会报错, 具体原因 PART3 再说. 但是我本地的默认 shell 是 zsh, 直接 ./yourShell.sh
为什么不会报错?
想到 ps 命令可以查看当前运行进程的一些信息, 就在脚本中添加 ps -L $$
, 运行后发现脚本是用 bash 运行的… 但是我的默认脚本是 zsh 啊, 再看看脚本, emmm第一行的意思以前听过但是一直没真的去试过, 改成 #!/bin/zsh
试试? 果然就报错了. 所以 #!
开头确实指定了 shell 脚本解释器的路径.
PART3: zsh 和 bash/sh 的一点区别
现在就剩一个问题了, 为什么 zsh 运行脚本报错? 查到 zsh 文档,
14.7.3 ‘=’ expansion If a word begins with an unquoted ‘=’ and the EQUALS option is set, the remainder of the word is taken as the name of a command. If a command exists by that > > name, the word is replaced by the full pathname of the command.
所以这里 if [$VAR1 == $VAR2]
第一个等号后面内容(也就是第二个等号)被当作一个命令, 然而并没有一个命令叫做 =
, 所以 zsh 报错了, 解决方案可以是
|
|
或者
|
|
回过来看这三点都挺简单, 但是混在一起却花费了一些时间才搞明白, 解决问题的能力还行, 但是基础还是要补一补呀.