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)
后记说明:
希望大家提出疑问和建议, 以便于本文的更新如果发现有相关的主题帖子,希望可以帖子的信息,添加到“Apple 社区相关主题”作为参考本技巧尽量提供中英文的参考资料,以便比照+参考+学习。谁有权威的资料,请告知以更新希望这个是集思广益的实用文,若我无法及时更新,版主或者其他同仁审核后更新
[链接经过版主编辑]