当我做
$ 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
。
您至少有三个选择:
在 中的某个地方创建
p0
一个脚本$PATH
,这样就watch
可以像其他可执行文件一样运行它。如果做得正确,这将非常强大。为 定义一个特殊别名
watch
:alias watch='watch '
然后发生了这样的事情:
如果别名值的最后一个字符是空格,那么还会检查别名后面的下一个命令字是否进行别名扩展。
所以
watch p0
会起作用(但watch -n 4 p0
不会)。为整个命令定义一个别名(或函数、脚本等):
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
它确实按预期工作。