bash 语法总结

重新加载 PATH 中的可执行文件

hash -r:用于解决在 PATH 中加入可执行文件后找不到的情况。

** 匹配多级目录(find 不能匹配双星号)

shopt -s globstar
set +o pipefail
clang-tidy -p build/ ./{src,include}/**/*.{h,hpp,cc,cpp,cu}

第一句是打开 ** 选项,第二句是忽略 pipefail(-o+o 相反)不然第三句的 pipe 可能出错,第三句 2>/dev/null 是忽略错误信息。

*** 都不能直接匹配 *nix 上的隐藏文件,即用 . 开头的文件。

上述命令的功能:clang-tidy 会找到 .clang-tidybuild/ 下的 compile_commands.json 配置并对代码进行分析。

bash 的 += 运算符

https://stackoverflow.com/a/18041780/

# 拼接字符串
s="hello"
s+=" world"
echo $s          # ==> "hello world"

# 整数加法
int=1
((int+=3))
echo $int        # ==> 4

# 数组拼接
declare -a arr='([0]="3" [1]="3")'
arr+=(12 20)
echo "${arr[@]}" # ==> 3 3 12 20

bash 正则

bash 正则用的是部分匹配:

# 检查结果是否为空白
if [[ "$result" =~ ^[[:space:]]*$ ]]; then
  echo OK
fi

为了严格匹配,有必要加上 ^$ 符号。

bash 命令的分隔符

; 表示上一条命令前台运行。& 表示上一条命令后台运行。

注意,& 并不是单纯表示放在后台的意思,因为 &; 是错误的用法,这会让 bash 读到一条空命令从而报错。

在 bash 退出的时候继续运行任务

tmux、nohup 都行。下面说一下 disown。

disown 是让给定的任务或当前的任务从 bash 的工作组中移除。而 disown -h 是让任务保持在工作组,但是在 bash 退出的时候不向其发送 HUP 信号。但这并不是说任务就能正常运行,因为如果任务和 interactive terminal 的输入流或者输出流相连,那么就会出现 broken pipe 的错误进而导致程序异常退出。

cd

cd 在没有参数的时候会检查 $HOME 环境变量,如果该环境变量不为空,则会将其作为参数;如果为空,命令不会生效。