shell 即“外壳”,是一个与系统内核(kernel)通信的程序。
shell 最简单的定义是:命令解释器(command interpreter)。
命令解释器的作用:
1. 将使用者的命令翻译给内核处理。
2. 同时,将内核处理的结果翻译给使用者。
登入(login)后,我们取得的 shell 叫:
login shell 或 primary shell
在 shell 内执行的命令,均是 shell 产生的子进程,这个过程叫做 fork
在 shell 内执行脚本(shell script),进程的 fork 过程为:
1. primary shell 产生 sub shell(即脚本)进程
2. sub shell 产生脚本中所有命令的进程
查看 Linux 中的 shell
cat /etc/shells
两大主流 shell
sh:sh、bash
csh:csh、tcsh、ksh
还有一个叫 zsh
命令提示符最右边的符号:
$:表明登录用户是普通用户
#:表明登录用户是 root
Carriage Return 即回车,按下回车键命令就开始执行。
PS1 为 shell 的内置变量,用于指定命令提示符字符串的样式。
shell 可接受的命令名称包括:
1. 包含完整路径的外部命令
2. 命令别名(alias)
3. 自定义功能(function)
4. 内置命令(built-in)
5. $PATH 变量指定的命令搜索路径
单引号和双引号的区别?
单引号会去掉所有 shell 元字符的特殊含义,变成普通字符。
双引号会去掉大部分元字符的特殊含义,但保留以下4个符号的特殊含义:
$(美元符)、`(反引号)、\(反斜杠)、”(双引号)
export 导出的环境变量:
环境变量会被子进程继承,注意shell 的环境变量,在子进程中的到的是环境变量的副本,子进程无法改变父进程的环境变量的值。
bash/sh、source/.(点)、exec 的区别?
shell 中运行外部命令会 fork 子进程,运行内部命令直接在 primary shell 中运行。
外部命令:bash/sh
内部命令:source/. 和 exec
bash/sh 的作用:
bash script_filename.sh #运行脚本
sh script_filename.sh #运行脚本
source/. 的作用:
直接在当前 shell 中运行脚本内容,如:
source script_filename.sh
. script_filename.sh
所以,source/. 可以用来加载 shell 初始环境,或者在脚本中导入另一个脚本的代码,就像 Python 的 import 一样。
() 和 {} 的区别?
() 将命令组(command group)置于子 shell中执行,也称为 nested sub-shell。
{} 则在同一个 shell 中执行命令,也成为 non-named command group,其实更像是一个未命名的函数。
命令替换:`cmd` 和 $(cmd):
反引号对有更好的可移植性。
$(cmd) 有更好的代码可读性。
${} 变量替换:
1,常规替换:
${var}
2,4种特殊替换:
${var:-string},${var:+string},${var:=string},${var:?string}
3,4种模式匹配替换:
${var%pattern}, ${var%%pattern}, ${var#pattern}, ${var##pattern}
4,字符串提取和替换:略
${#var} 可计算出变量的长度