我想与Watch Command一起使用bash中的别名命令。手表命令是多个链式命令。
一个非常简单的示例我会认为它会起作用(但行不通):
alias foo=some_command # a more complicated command
watch -n 1 "$(foo) | grep bar" # foo is not interpreted as the alias :(
watch -n 1 "$(foo) | grep sh"
是错误的,原因有两个。
-
当
watch "$(cmdA) | cmdB"
由Shell执行时,运行watch
之前的$(cmdA)
在之前将其扩展。然后,watch
将执行cmdA
的输出作为命令(在大多数情况下应该失败),然后将其输出输出到cmdB
。您可能是指watch 'cmdA | cmdB'
。 -
别名
foo
仅在当前外壳中定义。watch
不是内置命令,因此必须在不知道别名foo
的另一个外壳中执行其命令。这个答案中有一个小技巧,但是我们必须进行一些调整以使其与管道和选项一起使用
alias foo=some_command
alias watch='watch -n 1 ' # trailing space treats next word as an alias
watch foo '| grep sh'
请注意,必须在watch
别名内指定watch
的选项。尾随空间仅导致下一个单词被视为别名。使用watch -n 1 foo
BASH将尝试将-n
作为别名扩展,而不是foo
。
我制作了一个使用--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
;;
*)
seconds=1
args=${*:1}
;;
esac
watch --color -n "$seconds" --exec bash -ic "$args || true"
}
我只需要颜色和计时支持,但我敢肯定您可以添加更多。
该功能的肉是它直接在交互式模式下直接执行命令,因此可以在bash中使用通常可用于您的任何别名或命令。
我对脚本的经验并不那么公平,您的里程可能会有所不同。有时我必须按Ctrl+C
几次才能停止它,但是为了它的价值,我经常使用它六个月而没有问题。
要点表格:https://gist.github.com/ablacklama/550420C597F9599CF804D57D57DD6AAD131