监视别名 cmd 不起作用

监视别名 cmd 不起作用

当我做

$ watch kubectl get pods

它工作正常但做:

$ alias p0="kubectl get pods"
$ watch p0

出现错误:每 2.0 秒:p0
sh:p0:未找到命令

看起来 watch 正在启动一个子 shell,而我当前 shell 中的别名对子 shell 不可见。我确实有

$ shopt -s expand_aliases

在我的 .bashrc 的最顶部,但它没有帮助。

在 Mac OS Mojave 上使用 bash 版本 3.2.57 进行尝试。

更新:尝试了更多的事情:

$  watch -n 0.1 "source ~/.bashrc; shopt; alias p0; p0"

仍然不起作用。

cdable_vars     off
cdspell         off
checkhash       off
checkwinsize    off
cmdhist         on
compat31        off
dotglob         off
execfail        off
expand_aliases  on
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
gnu_errfmt      off
histappend      on
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         off
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        on
p0='kubectl get pods'   <--- HERE'S THE ALIAS
sh: p0: command not found  <--- STILL DOESN'T EXECUTE IT.

答案1

别名不会被子 shell 继承。函数可以被导出,但尽管这种方法使 Bash 继承了 Bash 导出的函数,但watch会产生干扰,主要是因为它会产生sh,而不是bash

您至少有三个选择:

  1. 在 中的某个地方创建p0一个脚本$PATH,这样就watch可以像其他可执行文件一样运行它。如果做得正确,这将非常强大。

  2. 为 定义一个特殊别名watch

    alias watch='watch '
    

    然后发生了这样的事情:

    如果别名值的最后一个字符是空格,那么还会检查别名后面的下一个命令字是否进行别名扩展。

    来源

    所以watch p0会起作用(但watch -n 4 p0不会)。

  3. 为整个命令定义一个别名(或函数、脚本等):

    alias wp0='watch kubectl get pods'
    

    然后输入wp0

答案2

function watcha() {
    a=$(alias $1) # extract the cmd from the alias

    #remove = sign and first/last ' before executing thru watch
    watch $(echo $a | awk -F= '{print $2}'|sed 's/.$//'|sed 's/^.//') 
}

现在当我这样做

$ watcha p0

它确实按预期工作。

相关内容