5月29日 01:18

什么是 Shell?常见的 Shell 类型有哪些?

Shell 是用户与操作系统内核之间的命令解释器,负责将用户输入的命令翻译给内核执行并返回结果。它同时也是一种脚本语言,可以将命令序列写入文件批量执行。Linux 默认 Shell 通常是 bash,macOS 从 Catalina 起默认切换为 zsh。生产环境中需关注兼容性:写可移植脚本时应以 POSIX sh 为基准,避免使用 bashism。Debian/Ubuntu 的 /bin/sh 实际指向 dash,执行速度比 bash 快但不支持其扩展语法。fish 交互体验好但语法不兼容 POSIX,不适合写通用脚本。

追问

1. /bin/sh 和 /bin/bash 有什么区别?为什么要区分? /bin/sh 是 POSIX 标准定义的 Shell,/bin/bash 在其基础上扩展了数组、[[ ]]、(( )) 等特性。脚本首行写 #!/bin/sh 意味着只使用 POSIX 语法,保证跨平台可移植;写 #!/bin/bash 则可以使用 bash 扩展但牺牲了可移植性。

2. 怎么查看当前系统使用的 Shell?怎么临时切换? echo $SHELL 查看默认 Shell,echo $0 查看当前 Shell。临时切换直接输入 bash 或 zsh 即可,永久切换用 chsh -s /bin/zsh。

3. zsh 相比 bash 有哪些优势?为什么 macOS 要切换? zsh 支持更强大的 Tab 补全(命令参数、文件路径)、右侧提示符、插件生态(oh-my-zsh)和递归通配符 **/*.sh。macOS 切换主因是 bash 3.2 受 GPL v3 许可限制无法升级,zsh 采用 MIT 许可更灵活。

4. dash 为什么比 bash 快?适合什么场景? dash 代码量小、不加载交互功能,启动速度快约 4 倍。适合作为 /bin/sh 执行系统启动脚本(如 /etc/init.d/),不适合交互使用。

写段代码

bash
#!/bin/sh # 检测当前 Shell 并给出建议 case "$SHELL" in */bash) echo "当前: bash" ;; */zsh) echo "当前: zsh" ;; */dash) echo "当前: dash" ;; *) echo "当前: $SHELL" ;; esac
标签:Shell