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