watch 命令的别名被停止?

watch 命令的别名被停止?

我创建了这个别名,以便别名在监视语句中得到扩展。

> alias w='watch -x bash -i -c'
> alias k=kubectl

我执行它:

> w 'k get pods; echo; k get svc'

两秒钟后我看到:

[2]+  Stopped                 watch -x bash -i -c 'k get pods; echo; k get svc'

手表命令停止了。

为什么 watch 命令会停止?

版本:Bash 5.1.16。乌班图22.04。

答案1

您的命令有两个问题:

  1. bash -i启动交互式 shell 会话,并且不能watch与交互式命令一起使用。这就是您收到“已停止”消息的原因。如果您从 shell 运行此命令zsh,它还会显示suspended (tty output).
  2. 别名不会被子进程继承,这意味着kshell 中的别名在您“监视”的 shell 中不可见。

反而:

watch -x bash -c 'kubectl get pods; echo; kubectl get svc'

或者,

watch 'kubectl get pods; echo; kubectl get svc'

这不会运行bash带有 的交互式 shell watch,并且不会尝试使用未定义的别名。

如果您运行交互式 shell 的目的是扩展别名,则使用bashexpand_aliasesshell 选项:

watch -x bash -O expand_aliases -c $'alias k=kubectl\nk get pods; echo; k get svc'

请注意,我必须在内联脚本中定义别名,并且还必须在别名定义之后插入文字换行符(不能在定义别名的同一行上使用别名)。我通过让命令字符串为 C 字符串 ( $'...'),然后添加换行符来实现此目的\n。您还可以在命令字符串中插入文字换行符,如下所示:

watch -x bash -O expand_aliases -c 'alias k=kubectl
k get pods; echo; k get svc'

相关内容