如果运行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
别名仅作为第一个参数展开,或者在命令末尾带有尾随空格的另一个别名之后展开。
从bash的help alias:
VALUE 中的尾随空格会导致在扩展别名时检查下一个单词的别名替换。
为此,请尝试以下操作:
alias watch='watch '
alias ll='ls -l --color=tty'
watch ll
Run Code Online (Sandbox Code Playgroud)
请记住,watch默认情况下某些版本的条带颜色,在某些版本上可以通过使用--color或来停止-G。
也许我们可以在 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)
根据需要工作。这很糟糕,在各种情况下都会失败。对不起。
我使用的另一个技巧(特别是用于别名kubectl)k是创建符号链接而不是别名。这样符号链接仍然可以被找到watch并且不需要任何欺骗。
这样做的缺点是,您必须为您想要使用的每个别名执行此操作,并且我不确定它对于 shell 内置函数如何工作。