alias不生效#
在修改一段shell脚本时,需要将函数里面的kubectl
命令替换为kubectl --insecure-skip-tls-verify=True
,使得脚本中的所有kubectl
命令执行时会自动加上选项--insecure-skip-tls-verify=True
。首先想到的就是利用alias
别名,示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function func1(){
...
kubectl get deployment -n ${NAMESPACE} ${CI_PROJECT_NAME} # 不生效
...
}
...
function main(){
...
alias kubectl="kubectl --insecure-skip-tls-verify=True"
kubectl get ns # 不生效
...
}
|
但是用上面方式改来改去kubectl选项不生效。
原因是:alias
不能直接在同一个命令解析单元里面定义并使用,必须在定义alias
的命令解析单元解析执行完成后,才能生效。
因此,在函数里面使用alias时,可以用下面函数的方式:
1
2
3
4
| function main(){
kubectl() { /usr/bin/kubectl --insecure-skip-tls-verify=True "$@"; }
kubectl get ns # 此处等同于kubectl加了--insecure-skip-tls-verify=True选项
}
|
当然也可以把alias
放在函数外、脚本的前面。
命令解析单元#
解析单元就是一组完整的命令(包括组合命令、循环等)后面跟上换行符。
shellcheck项目的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 单个命令跟换行,一个解析单元
unit 1
# 俩命令在同一解析单元,之间无换行
unit 2; unit 2;
# 大括号的同一个解析单元
{
unit 3
unit 3
}
# 也是同一个解析单元,在大括号组之间无换行
{
unit 4
}; {
unit 4
}
|
上面示例中,unit1中定义的别名,只能在unit2及后面才能使用。
推荐bash脚本检查工具:shellcheck