Shell Reference
tip
- SSH 登录的 shell 为非 login shell
$-= himBHs
| var | for |
|---|---|
$0 | 当前脚本名 |
@# | 参数数量 |
$1 - $9 | 第N个参数 |
$* | 所有参数, 单个字符串 |
$@ | 所有参数, 数组 |
$? | 上一个命令的退出状态 |
$$ | 当前进程的 PID |
$! | 后台运行的最后一个进程的 PID |
$- | set options |
$_ | 上一个命令的最后一个参数, mkdir -p ~ && cd $_ |
| var | for |
|---|---|
| SHELL | 当前 shell PATH |
| SHLVL | shell 嵌套深度 |
| FUNCNAME | 当前函数名字 |
| COMP_CWORD | 当前补全的单词索引 |
| COMP_LINE | 当前补全的命令行 |
| COMP_POINT | 光标在命令行中的位置 |
| COMP_WORDS | 当前补全的单词数组 |
| DIRSTACK | 目录栈 |
| EUID | 当前用户的有效用户 ID |
| FUNCNAME | 当前函数名字 |
| GROUPS | 当前用户所属的组 ID 列表 |
| HOSTNAME | 当前主机名 |
| HOSTTYPE | 当前主机类型 |
| LINENO | 当前脚本行号 |
| MACHTYPE | 系统类型 |
| OLDPWD | 上一个工作目录 |
| OPTERR | getopts 错误处理标志 |
| OSTYPE | 操作系统类型 |
| PIPESTATUS | 管道中各命令的退出状态 |
| PPID | 父进程的 PID |
| PWD | 当前工作目录 |
| RANDOM | 随机数 |
| REPLY | read 命令的默认变量 |
| SECONDS | 脚本运行的秒数 |
| SHELLOPTS | 当前启用的 shell 选项 |
| UID | 当前用户的用户 ID |
Bash
| var | for |
|---|---|
| BASH | 当前使用的 Bash 版本 |
| BASH_ENV | 非交互式 shell 启动时加载 |
| BASH_VERSION | Bash 版本信息 |
| BASHOPTS | 当前启用的 Bash 选项 |
| BASH_ALIASES | 当前定义的别名 |
| BASH_ARGC | 每个函数调用的参数个数 |
| BASH_ARGV | 每个函数调用的参数值 |
| BASH_CMDS | 哈希表,记录命令的位置 |
| BASH_LINENO | 当前脚本行号 |
| BASH_SOURCE | 当前脚本的文件名 |
| BASH_SUBSHELL | 子 shell 的嵌套级别 |
| BASH_VERSINFO | Bash 版本信息数组 |
# 当前 SHELL - $0 最稳定
echo $SHELL # /bin/bash - ash 不支持
ps -p $$ # busybox ps 没有 -p
echo $0 # /bin/zsh, -bash, ash
getent passwd $USER | cut -d: -f7 # 为用户配置的 shell
chsh -l # 列出可用 shell - 一般 chsh 不支持
# check Login
shopt -q login_shell && echo Login shell # for Bash
[[ -o login ]] && echo Login shell # for ZSH
[[ "$0" == -* ]] && echo Login shell # for Posix
[[ "$-" == *i* ]] && echo Interactive shell
Options
| opt | $- | desc |
|---|---|---|
| allexport | a | export 所有变量 |
| braceexpand | B | {a,b} -> a b |
| emacs | emacs 模式 | |
| errexit | e | 命令失败则退出 |
| errtrace | E | 继承 ERR trap |
| functrace | T | 继承 DEBUG, RETURN trap |
| hashall | h | 跟踪 PATH 发现的命令 |
| histexpand | H | history expansion, !number |
| history | ||
| ignoreeof | 交互式 shell, Ctrl-D 退出 | |
| interactive | i | 交互 |
| keyword | k | |
| monitor | m | job 管理 |
| noclobber | C | 避免 >, >&, <> 覆盖文件 |
| noexec | n | |
| noglob | f | |
| nolog | ||
| notify | b | |
| nounset | u | |
| onecmd | t | |
| physical | P | 不 resolve symlink |
| pipefail | ||
| posix | ||
| privileged | P | 特权 模式 |
| stdin | s | 从 stdin 读取 |
| verbose | v | |
| vi | vi 模式 | |
| xtrace | x | 回显执行的内容, 输出前缀为 PS4 |
| r | restricted 模式 |
- privileged
- 不处理 ENV
- 不继承 shell 函数
- 不继承 HELLOPTS, BASHOPTS, CDPATH, GLOBIGNORE
- Bash
Compact
[- 不支持 glob match - 可以使用 case 写法
[[- ksh, bash, zsh
- dash 现在也支持
- test
case "abc" in; *b*) echo 1 ;; esac # 这样兼容性最好
[[ "abc" == '*b*' ]] && echo 1
test "abc" == *b* && echo 1 # 如果会匹配文件有问题
# Glob match 文件
# for Bash
if compgen -G "/tmp/someFiles*" > /dev/null; then
echo "Some files exist."
fi
if test -n "$(
shopt -s nullglob
echo glob*
)"; then
echo found
fi
if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)"; then
echo found
fi
stat -t glob* > /dev/null 2>&1
(
shopt -s failglob
: *
) 2> /dev/null && echo exists
Configuration
- profile - for login shell
- 只在 login 时加载一次,之后会继承
- setup PATH
- rc - for interactive shell
- 每次启动 shell 时加载
- setup Terminal, autocomplete, prompt
| item | sh | BASH | ZSH |
|---|---|---|---|
| profile | .profile | .bash_profile | .zprofile |
| rc | .bashrc | .zshrc | |
| login | .bash_login | .zlogin | |
| logout | .bash_logout | .zlogout |
- PATH
- $HOME/.local/bin - by XDG 3.0
- $HOME/bin - persinal bin
- bash
--login,-l- Login-i- Interactive-r- Restricted--noprofile- /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile
--norc- ~/.bashrc
--rcfile ~/.bashrc--init-file FILE- non-interactively
- load
$BASH_ENV- e.g.
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
- e.g.
- load
- symlink to sh
- minimic sh
.profile
- SHELLOPTS, BASHOPTS, CDPATH, GLOBIGNORE
- zsh
- ZDOTDIR=$HOME
- TMPPREFIX=/tmp/zsh
- TCSH
- .login, tcshrc, .logout
- PDKSH
- .profile, .kshrc
- bash.1
- Bash Startup Files
ZSH
| opt | flag | for |
|---|---|---|
| 目录修改 | ||
| AUTO_CD | -J | 输入目录名后自动执行 cd 命令,适用于交互模式 |
| AUTO_PUSHD | -N | cd 命令会将旧目录推入目录栈 |
| CDABLE_VARS | -T | cd 参数不是目录时,尝试将其扩展为变量 |
| CD_SILENT | cd 后不打印当前目录 | |
| CHASE_DOTS | 处理 .. 时解析为物理目录路径,而不是取消上一个路径段 | |
| CHASE_LINKS | -w | 切换目录时解析符号链接为真实路径,包含 CHASE_DOTS 的效果 |
| POSIX_CD | 使 cd 和 pushd 更符合 POSIX 标准 | |
| PUSHD_IGNORE_DUPS | 不将相同目录多次推入目录栈 | |
| PUSHD_MINUS | 交换 + 和 - 在目录栈中的含义 | |
| PUSHD_SILENT | -E | pushd 和 popd 后不打印目录栈 |
| PUSHD_TO_HOME | -D | pushd 无参数时切换到 $HOME |
| 补全 | ||
| Expansion and Globbing | ||
| History | ||
| 初始化 | ||
| 输入/输出 | ||
| Job Control | ||
| Prompting | ||
| 脚本和函数 | ||
| Shell Emulation | ||
| Shell State | ||
| INTERACTIVE | -i | 交互式 shell,启用后从标准输入读取命令。 |
| LOGIN | -l | 登录 shell,启用时标识为登录会话。 |
| PRIVILEGED | -p | 特权模式,启用后用于提升权限运行脚本。 |
| RESTRICTED | -r | 限制模式,启用后限制对系统资源的访问。 |
| SHIN_STDIN | -s | 从标准输入读取命令,如果未指定命令文件则启用。 |
| SINGLE_COMMAND | -t | 从标准输入读取并执行单个命令后退出。 |
| Zle | ||
- ZSH
Posix
- 函数名字 -
[a-zA-Z_][a-zA-Z0-9_]* - https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html