如果运行watch
包含别名的命令,则不会扩展别名。我已经尝试过使用单引号和双引号,实际上给出了以下别名:
# alias ll
alias ll='ls -l --color=tty'
下面的命令会失败
# watch ll
sh: ll: command not found
在这种情况下,命令行扩展不应该起作用吗?
答案1
别名仅作为第一个参数展开,或者在命令末尾带有尾随空格的另一个别名之后展开。
来自bash
的help alias
:
展开别名时,VALUE 中的尾随空格会导致检查下一个单词是否有别名替换。
为此,请尝试以下操作:
alias watch='watch '
alias ll='ls -l --color=tty'
watch ll
请记住,某些版本的条带颜色默认情况下,在某些版本上可以通过使用或watch
来停止。--color
-G
答案2
也许我们可以在 watch 看到别名之前手动扩展别名?
watch $(alias ll | cut -d\' -f2)
解释
的输出alias ll
看起来像:
$ alias ll
alias ll='ls -lAGh'
因此,我们将 cut 的分隔符设置为单引号,并剪切第二个字段,留下:
ls -lAGh
即扩展的别名。那然后形成赋予 的 args watch
。
创建一个函数来完成它
function watcha {
watch $(alias "$@" | cut -d\' -f2)
}
然后,
watcha ll
按预期工作。这很糟糕,并且在各种情况下都会失败。对不起。
答案3
我使用的另一个技巧(特别是用于别名kubectl
)k
是创建符号链接而不是别名。这样符号链接仍然可以被找到watch
并且不需要任何欺骗。
这样做的缺点是,您必须为您想要使用的每个别名执行此操作,并且我不确定它对于 shell 内置函数如何工作。
答案4
这是使用该--color
选项并允许您使用参数-n
来指定刷新间隔的一个。
swatch_usage() {
cat <<EOF >&2
NAME
swatch - execute a program periodically with "watch". Supports aliases.
SYNOPSIS
swatch [options] command
OPTIONS
-n, --interval seconds (default: 1)
Specify update interval. The command will not allow quicker than
0.1 second interval.
EOF
}
swatch() {
if [ $# -eq 0 ]; then
swatch_usage
return 1
fi
seconds=1
case "$1" in
-n)
seconds="$2"
args=${*:3}
;;
-h)
swatch_usage
return 1
;;
*)
seconds=1
args=${*:1}
;;
esac
watch --color -n "$seconds" --exec bash -ic "$args || true"
}
我只需要颜色和时间支持,但我相信如果您愿意,您可以添加更多。
该函数的核心是它直接在交互模式下使用 bash 执行命令,因此可以使用 bash 中通常可用的任何别名或命令。
我对脚本编写没有那么丰富的经验,所以公平警告,您的里程可能会有所不同。有时我必须按Ctrl+C几次才能让它停止,但不管怎样,我已经频繁使用它 6 个月了,没有出现任何问题。
要点形式:https://gist.github.com/ablacklama/550420c597f9599cf804d57dd6aad131