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