watch 命令别名扩展

zta*_*013 96 bash alias

如果运行watch包含别名的命令,则不会扩展别名。我已经尝试过单引号和双引号,实际上给出了以下别名:

# alias ll
alias ll='ls -l --color=tty'
Run Code Online (Sandbox Code Playgroud)

以下命令将失败

# watch ll
sh: ll: command not found
Run Code Online (Sandbox Code Playgroud)

在这种情况下,命令行扩展不应该起作用吗?

Chr*_*own 152

别名仅作为第一个参数展开,或者在命令末尾带有尾随空格的另一个别名之后展开。

bashhelp alias

VALUE 中的尾随空格会导致在扩展别名时检查下一个单词的别名替换。

为此,请尝试以下操作:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll
Run Code Online (Sandbox Code Playgroud)

请记住,watch默认情况下某些版本的条带颜色,在某些版本上可以通过使用--color或来停止-G

  • 不幸的是,这个方法有一个限制,你不能为 `watch` 提供选项,因为别名必须是下一个单词,而 `watch` 在命令运行之前需要它的参数。如果您尝试了 `watch -n 10 <alias>`,bash 将不会扩展别名。要解决这个问题,您需要一个别名,其中包含您想要的选项(例如,`alias watch-10='watch -n 10 '),并且仍然带有尾随空格。 (26认同)
  • 这绝对是很棒的答案!谢谢,当然+1。 (3认同)
  • 谢谢... 一直以来,我习惯于 1. 输入 ll,2. 按 ctrl+alt+e,3. 然后前缀 watch。这是一个节省时间的方法。 (3认同)

Jon*_*ley 9

也许我们可以在 watch 看到之前手动扩展别名?

watch $(alias ll | cut -d\' -f2)
Run Code Online (Sandbox Code Playgroud)

解释

的输出alias ll看起来像:

$ alias ll
alias ll='ls -lAGh'
Run Code Online (Sandbox Code Playgroud)

所以我们将 cut 的分隔符设置为单引号,并剪切第二个字段,留下:

ls -lAGh
Run Code Online (Sandbox Code Playgroud)

即扩展别名。进而形成给予ARGS watch

做一个功能来做到这一点

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}
Run Code Online (Sandbox Code Playgroud)

然后,

watcha ll
Run Code Online (Sandbox Code Playgroud)

根据需要工作。这很糟糕,在各种情况下都会失败。对不起。

  • +1 的独创性和对失败案例的管理:) (3认同)

Ben*_*oss 5

我使用的另一个技巧(特别是用于别名kubectlk是创建符号链接而不是别名。这样符号链接仍然可以被找到watch并且不需要任何欺骗。

这样做的缺点是,您必须为您想要使用的每个别名执行此操作,并且我不确定它对于 shell 内置函数如何工作。

  • 除了 shell 内置函数之外,这对于检查其调用名称的二进制文件也不起作用。这包括 busybox、[允许稳定和按目录覆盖的 rustup 垫片] 和 bash(如果称为“/something/sh”,则会禁用某些功能) (2认同)