将别名命令翻译为完整形式

将别名命令翻译为完整形式

我使用 Ubuntu 终端来管理我的工作。我创建了一些别名,以帮助我更快地完成工作。

例如:

$ alias kprod="kubectl --namespace=hello"

然后像这样使用它:

$ kprod get pods

我的主要任务之一是找出我的应用程序何时可以在云上运行,因此我调用此代码:

$ kprod get pods | grep APPNAME

但我需要一次又一次地运行它,直到它准备好为止。我想使用命令来简化这个任务。不幸的是,由于它是一个别名,watch所以 watch 不起作用。kprod

$ watch kprod get pods
sh: 1: kprod: not found

我的问题:

  1. watch是否可以使用shell 命令解决这个特定问题?
  2. 是否有可能提出一个更通用的解决方案来“翻译”命令以适应实际的表达?例如:

    $ kprod get pods | TRANSLATE
    kubectl --namespace=hello get pods
    

watch这使得它能与任何其他应用程序一起工作吗?

更新

使用type命令类似但不同。正如我所尝试的,不可能给它一个完整的表达式并“翻译”它,因为它试图分别转换表达式的每个标记。当然,pod(在我上面的例子中)不是别名字符串...

例如:

$ type kprod get pods
kprod is aliased to `kubectl --namespace=hello'
-bash: type: get: not found
-bash: type: pods: not found

是的,我可以用命令手动完成type,但这是手动的。我正在寻找自动化的方法。

答案1

是的,您可以编写一个名为watch_alias(或任何其他名称) 的小脚本,它将扩展别名,然后将扩展的命令传递给watch。将以下内容另存为~/bin/watch_alias并使其可执行 ( chmod a+x ~/bin/watch_alias):

#!/bin/bash

## enable alias expansion in scripts
shopt -s expand_aliases
## source the .bashrc file where your aliases should be
. ~/.bashrc

## The first argument of the script is the alias
aliasCom=$1
## Remove the 1st argument from the $@ array (the script's arguments)
shift

## Parse the output of type to get what the real command is
realCom=$(type "$aliasCom" | grep -oP "\`\K.[^']+")
## watch the unaliased command
watch bash -c "$realCom '$@'"

然后您可以运行这个来代替watch

watch_alias kprod get pods

答案2

别名可以作为终端中的快捷方式。但反过来却不行。您打算使用别名的方式与别名的预期方式不同。

原则上,在自动化中使用时,只需完整输入命令即可。但是,您可以通过创建可执行脚本将别名转换为命令:

Bash 脚本的内容kprod

#!/bin/bash
kubectl --namespace=hello $@

命令末尾的 $@ 将扩展为您在命令行上传递的所有参数。

将此脚本放在您路径中的文件夹中。这样,只需输入名称即可运行脚本。虽然设置起来有些困难,但它作为别名同样容易使用。此外,您还可以在自动化中使用它。

相关内容