跳到主要内容

Shell Reference

提示
  • SSH 登录的 shell 为非 login shell
    • $- = himBHs
varfor
$0当前脚本名
@#参数数量
$1 - $9第N个参数
$*所有参数, 单个字符串
$@所有参数, 数组
$?上一个命令的退出状态
$$当前进程的 PID
$!后台运行的最后一个进程的 PID
$-set options
$_上一个命令的最后一个参数, mkdir -p ~ && cd $_
varfor
SHELL当前 shell PATH
SHLVLshell 嵌套深度
# 当前 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