XiaO

关于人机交互的 shell

XiaO / 2020-06-06


编译与解释

使用某个编程语言编写的源代码,其执行方式可以是:编译成新代码执行通过解释器解释执行

编译器:将使用 A 语言编写的源代码编译成 B 语言后,再执行 B 语言;
解释器:即直接执行使用 A 语言编写的源代码;(解释器的内部是一个编译器加一个虚拟机,编译器把输入语言编译成中间语言,虚拟机直接执行中间语言。)

shell

shell 是一个命令行解释器,是一层套在机器外用于人机交互的壳。其具体作用是用户输入一条命令,shell 就立即解释执行一条。

只要是人与电脑之间交互的接口,就可以称为 shell,不局限于系统、语言、操作方式和表现方式。比如我们在 terminal 或者 iterm2 中输入命令,叫 command-line interface (CLI);在屏幕上点击,叫 graphical user interface (GUI)

Terminal or iTerm2

Terminal 或者 iTerm2,是一个程序,shell 运行于其中。

shell 的 login 与 non-login

login shell 是指登录系统后所获得的顶层 shell,比如 ssh 登录,登录完后得到一个 login shell;
non-login shell:登录桌面电脑后,在 terminal 中直接打开的 shell。

shell 解释器类型

shell 解释器有 sh、bash、ksh、csh 和 zsh 等。macOS 中默认安装了以上所有类型。只要一门语言有解释器,就可以作为 shell 使用。

macOS 的默认 shell 为 zsh,推荐插件

brew install zsh-autosuggestions # 根据历史记录建议
brew install zsh-syntax-highlighting # 语法高亮
brew install powerline-go # https://github.com/justjanne/powerline-go

shell 配置文件

shell 在启动时会自动加载相应的配置文件。

bash (in non-login interactive shells): 加载 ~/.bashrc
bash (login shells): 加载 .bash_profile.inputrc
zsh (in all interactive shells): 加载 ~/.zshrc;
zsh (in login shells): 加载 ~/.zprofile;

# 查看当前使用的 shell 类型,以便配置相应的加载文件
echo $SHELL

# 将插件添加到配置文件中,以便后续启动 shell 时自动加载;
source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh 
source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

shell 的 PATH 变量 (路径)

The shell path for a user in macOS is a set of locations in the filing system whereby the user has permissions to use certain applications, commands and programs without the need to specify the full path to that command or program in the Terminal. The PATH variable is basically a list of directories your computer looks through to find a requested executable.

shell 解释器的 PATH 是计算机查找相应可执行文件的一组文件目录(路径)列表。macOS 的应用程序存放在一个叫 Applications 的文件夹中,而 shell 的可执行文件可能存放在不同的文件夹中。比如 pyhton 3 的命令行执行文件,其完整路径为 /usr/local/bin/python3,它存放在 /usr/local/bin/ 路径下。

我们将 /usr/local/bin/ 添加到 shell 的 PATH 变量中后,我们在 Termminal 中 启动 pyhton 3 时候,不必像下面这样输入其完整路径启动:

/usr/local/bin/python3

而只需要直接输入命令本身即可启动:

python3

可用 echo $PATH 命令显示 PATH 中的文件目录列表。shell 解释器的 PATH 中,其文件目录之间用英文(半角)冒号 : 隔开。

echo $PATH # 在 Terminal 查看已经加入到 PATH 变量中的文件目录

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin # PATH 变量的值显示为 

如上显示, shell 的 PATH 变量中有 5 个文件目录(路径),并用冒号分隔。这意味着我们可以在 Terminal 中直接调用这 5 个文件目录下的可执行文件。

/usr/local/bin # 用户安装的可执行文件
/usr/bin # 普通工具,编程工具以及应用软件
/bin # 用户工具
/usr/sbin # 系统维护和系统工具
/sbin # 系统程序和管理工具

另外,一些文件软件管理程序会使用类似的文件目录来存放所安装的软件,比如 Homebrew 将软件安装到 /usr/local/Cellar 目录下,而后通过符号链接的方式,将所安装的软件链接到 /usr/local/bin中。

在相应的 shell 的配置文件中,可用如下语法,将需要添加的/usr/local/mysql/bin 文件目录添加到原来的目录列表 $PATH 之前,并用英文冒号隔开。

export PATH="/usr/local/mysql/bin:$PATH"

另外, 在 PATH 中,文件目录之间是有先后排序的,即 shell 在执行某个可执行文件时,是按照 PATH 中文件目录的先后顺序查找该可执行文件所在的目录并启用的。

更改文件目录的先后排序,只需将各个文件目录重新排序即可。一般优先将 /usr/local/bin 目录放在/usr/bin之前,这样用户可自行安装某个软件的最新版本,并优先调用用户所安装的版本而非系统自带版本。而系统升级的话,也不会影响到用户所安装的软件。

export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

macOS 中的符号链接

ln -s target linkname

除开Unix系统下的普通符号链接之外,macOS 还能使用别名(aliases)。例如,将可执行文件 namd2 添加到 PATH 中,并别名为 namd。

alias namd='~/NAMD_2.14b1_MacOSX-x86_64-multicore/namd2'

更改 shell 中 macOS 默认调用的 python 版本

(针对使用 homebrew 安装 python3 的情况)

macOS 默认的 python 版本为 pyhton 2。可用别名的方式修改 shell 中 pyhon 版本的调用。这样做的好处是可以不影响其他依赖 pyhton 2 的程序。

alias p2='python'
alias p3='python3'
alias python='python3' # 自动调用 pyhton 3 而非 python 2