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-tidy 和 build/ 下的 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 环境变量,如果该环境变量不为空,则会将其作为参数;如果为空,命令不会生效。