Skip to main content

Shell Reference

tip
  • SSH 登录的 shell 为非 login shell
    • $- = himBHs
varfor
$0当前脚本名
@#参数数量
$1 - $9第N个参数
$*所有参数, 单个字符串
$@所有参数, 数组
$?上一个命令的退出状态
$$当前进程的 PID
$!后台运行的最后一个进程的 PID
$-set options
$_上一个命令的最后一个参数, mkdir -p ~ && cd $_
varfor
SHELL当前 shell PATH
SHLVLshell 嵌套深度
FUNCNAME当前函数名字
COMP_CWORD当前补全的单词索引
COMP_LINE当前补全的命令行
COMP_POINT光标在命令行中的位置
COMP_WORDS当前补全的单词数组
DIRSTACK目录栈
EUID当前用户的有效用户 ID
FUNCNAME当前函数名字
GROUPS当前用户所属的组 ID 列表
HOSTNAME当前主机名
HOSTTYPE当前主机类型
LINENO当前脚本行号
MACHTYPE系统类型
OLDPWD上一个工作目录
OPTERRgetopts 错误处理标志
OSTYPE操作系统类型
PIPESTATUS管道中各命令的退出状态
PPID父进程的 PID
PWD当前工作目录
RANDOM随机数
REPLYread 命令的默认变量
SECONDS脚本运行的秒数
SHELLOPTS当前启用的 shell 选项
UID当前用户的用户 ID

Bash

varfor
BASH当前使用的 Bash 版本
BASH_ENV非交互式 shell 启动时加载
BASH_VERSIONBash 版本信息
BASHOPTS当前启用的 Bash 选项
BASH_ALIASES当前定义的别名
BASH_ARGC每个函数调用的参数个数
BASH_ARGV每个函数调用的参数值
BASH_CMDS哈希表,记录命令的位置
BASH_LINENO当前脚本行号
BASH_SOURCE当前脚本的文件名
BASH_SUBSHELL子 shell 的嵌套级别
BASH_VERSINFOBash 版本信息数组
# 当前 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
allexportaexport 所有变量
braceexpandB{a,b} -> a b
emacsemacs 模式
errexite命令失败则退出
errtraceE继承 ERR trap
functraceT继承 DEBUG, RETURN trap
hashallh跟踪 PATH 发现的命令
histexpandHhistory expansion, !number
history
ignoreeof交互式 shell, Ctrl-D 退出
interactivei交互
keywordk
monitormjob 管理
noclobberC避免 >, >&, <> 覆盖文件
noexecn
noglobf
nolog
notifyb
nounsetu
onecmdt
physicalP不 resolve symlink
pipefail
posix
privilegedP特权 模式
stdins从 stdin 读取
verbosev
vivi 模式
xtracex回显执行的内容, 输出前缀为 PS4
rrestricted 模式

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
itemshBASHZSH
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
    • symlink to sh
      • minimic sh
      • .profile
    • SHELLOPTS, BASHOPTS, CDPATH, GLOBIGNORE
  • zsh
    • ZDOTDIR=$HOME
    • TMPPREFIX=/tmp/zsh

ZSH

optflagfor
目录修改
AUTO_CD-J输入目录名后自动执行 cd 命令,适用于交互模式
AUTO_PUSHD-Ncd 命令会将旧目录推入目录栈
CDABLE_VARS-Tcd 参数不是目录时,尝试将其扩展为变量
CD_SILENTcd 后不打印当前目录
CHASE_DOTS处理 .. 时解析为物理目录路径,而不是取消上一个路径段
CHASE_LINKS-w切换目录时解析符号链接为真实路径,包含 CHASE_DOTS 的效果
POSIX_CD使 cdpushd 更符合 POSIX 标准
PUSHD_IGNORE_DUPS不将相同目录多次推入目录栈
PUSHD_MINUS交换 +- 在目录栈中的含义
PUSHD_SILENT-Epushdpopd 后不打印目录栈
PUSHD_TO_HOME-Dpushd 无参数时切换到 $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

Posix