Mac 操作系统中shell的相关问题

上次修改时间: 2022年9月23日 下午10:02
2 5825 上次修改时间 2022年9月23日 下午10:02

shell配置产生的问题


阅读信息

版本:0.2.20220923

难度10:1 ~ 3

阅读时间:10 分钟

适合操作系统:10.5, 10.6, 10.8, 10.9, 10.10, 10.11, 10.12, 10.13, 10.14, 10.15, 11, 12


简介

Mac操作系统是经The Open Group认证的符合UNIX 03规范的操作系统,业界俗称的类-Unix系统。


shell是Unix的壳层,用于人机交互的一种基于文本的交互界面,是介于Unix核心和用户之间的交互程序的总称。

每个 Mac 系统的用户都会有一个shell的设置,这个设置是在用户账户参数中的。随着Mac操作系统的更新换代,系统默认的shell也会有变化。Mac 系统自带的 shell 有:bash, csh, ksh, sh, tcsh, zsh 等,它们都在/bin目录中。系统默认使用 bash 或 zsh。用户的默认shell可以被修改。


一个用户的默认 shell 取决于Mac系统版本以及用户生成时的宿主系统。

如果是新建用户,会依据当前操作系统的版本默认设置,规则如下:

macOS 10.14 以及旧版系统,默认的是 bash,路径是/bin/bash

macOS 10.15 以及新版系统,默认的是 zsh,路径是/bin/zsh

如果是升级了操作系统的情况下,在升级之前已经存在的用户,shell 设置不会变化, 也就是说,原来是 bash,依然保持 bash。



如何确认shell

不同shell对于配置方法和命令解释不同,当遇到问题时,先确认当前的shell是什么,再针对该shell进行搜索或提问。

实际操作中,有可能有两种 shell 环境,一种是运行时的,一种是用户默认的。


确认当前进程(运行时的)正在使用的shell,可采用下面命令中的一个(后附参考资料):

echo $0
ps -p $$


确认当前用户默认shell,可采用下面命令中适当的一个:

echo $SHELL
dscl . -read /Users/$(id -un) UserShell


变更用户默认的 shell

首先,可以用下面的命令来看看 macOS 系统有哪些认可的 shell

cat /etc/shells


下面是在 macOS Monterey 12系统上列出的结果,哪些以/bin/为开始的行就是了:

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

了解了可用的 shell 之后,可以用下面的命令来变更默认的 shell 了。

chsh -s /bin/dash


上面这个命令把当前用户的默认 shell 变更为了 /bin/dash了。


小贴士:如果,你的 Mac 想我一样,创建了多个账户,你可以为其它的账户变更默认 shell。很简单,就是在前面的命令后面加上要变更的用户的用户名即可。


shell 的配置

当一个 shell 启动的时候,会根据被调用方式(交互式、带有参数等等),逐步读取相应的配置文件并执行其中的命令配置运行环境等操作。

如果配置文件错误,可能导致意外后果,比如,系统无法启动、系统不稳定、系统服务无法启动、用户无法登陆、无法运行终端程序、命令运行错误等等。


系统和用户级配置文件

放置在/etc/目录中的都是系统级的。而在用户个人文件夹目录(一般用“~”或者 “$HOME”获得)中的,系统默认路径“/Users/用户名”里面的,都是用户级别的。用户应该仅自己创建用户级的配置文件。

例如 “/etc/profile” 的是系统级别,“~/.profile” 的是用户级别的。


几个基本原则

  • 除非必要和确认自己在做什么,否则不要修改系统级的配置文件
  • 修改配置文件要谨慎,使用适当的纯文本编辑工具
  • 给别人建议时,自己一定要测试并考虑多种情况


bash配置文件

下面是 bash 中相关的配置文件:

/etc/profile
/etc/bashrc
/etc/bashrc_Apple_Terminal

~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc


zsh配置文件

下面是 zsh 中相关的配置文件:

/etc/zshenv
/etc/zprofile
/etc/zshrc
/etc/zlogin
/etc/zlogout

~/.zshenv
~/.zprofile
~/.zshrc
~/.zlogin
~/.zlogout


问题的排除步骤

  • 当终端或者 shell 命令出问题后,怀疑是配置文件造成的。依照上面列出的相关配置文件,先从用户级的排查。


  • 如果不知道那里出错,使用 cat 命令把配置文件逐个列出来,把输出结果,提交或截屏或文字拷贝,以便别人帮你解读。 比如运行下面的命令,来显示 ~/.zprofile 的内容:
cat ~/.zprofile


  • 如果终端都进不去了,可以尝试用第三方应用,比如 iTerm2 等;或者在一个新建的管理员账户中操作。然后,在提问中说明自己所做的步骤,以及问题账户名称和新建账户名称,以寻求帮助。


提示:寻求帮助的时候,为了避免来回提问解答拖延时间,尽量详细说明情况,比如:macOS 版本,错误现象,错误信息,终端程序是否电放,自己采取的步骤等等,最好是图文并茂。


Apple 社区相关主题

[待更新]


----------------------------

参考资料

English:【Wikipedia-Shell 】【 Wikipedia-Unix Shell 】【The Unix Shell (github) 】【Is macOS UNIX

Video: 【苹果电脑终端使用技巧 MacOs Terminal(bilibili)

中文:【shell

视频:【什么是 shell (bilibili)】【什么是shell解释器 (bilibili)】【把Mac终端命令用起来 (bilibili)

参考文章或书籍:

【苹果的《终端使用手册》( | )】【Mac OS X For Unix Geeks (O'reilly)】

命令:

执行命令调出系统说明:`man bash` 或 `man zsh`

How to determine the current shell I'm working on (stackoverflow)



后记说明

    1. 希望大家提出疑问和建议, 以便于本文的更新
    2. 如果发现有相关的主题帖子,希望可以帖子的信息,添加到“Apple 社区相关主题”作为参考
    3. 本技巧尽量提供中英文的参考资料,以便比照+参考+学习。谁有权威的资料,请告知以更新
    4. 希望这个是集思广益的实用文,若我无法及时更新,版主或者其他同仁审核后更新


[链接经过版主编辑]

评论

2021年10月23日 下午3:54

Peter, 不确定你说的 console 是仪表盘的意思,还是特指 macOS 中的“终端程序”(Terminal.app)。如果说是类比一般仪表盘或仪器控制面版等,没问题的啊。其实,图形界面也是一种介于用户和系统核心的层面,类似于仪器控制面版。

2021年10月23日 下午3:54

欢迎来到 Apple 支持社区
Apple 客户在其产品方面互相帮助的论坛。使用您的 Apple 帐户开始畅游其中吧!!