![将别名命令翻译为完整形式](https://linux22.com/image/912501/%E5%B0%86%E5%88%AB%E5%90%8D%E5%91%BD%E4%BB%A4%E7%BF%BB%E8%AF%91%E4%B8%BA%E5%AE%8C%E6%95%B4%E5%BD%A2%E5%BC%8F.png)
我使用 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
我的问题:
watch
是否可以使用shell 命令解决这个特定问题?是否有可能提出一个更通用的解决方案来“翻译”命令以适应实际的表达?例如:
$ 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 $@
命令末尾的 $@ 将扩展为您在命令行上传递的所有参数。
将此脚本放在您路径中的文件夹中。这样,只需输入名称即可运行脚本。虽然设置起来有些困难,但它作为别名同样容易使用。此外,您还可以在自动化中使用它。