bash:如何将别名命令与手表结合使用



我想与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"是错误的,原因有两个。

  1. watch "$(cmdA) | cmdB"由Shell执行时,运行watch之前的$(cmdA)在之前将其扩展。然后,watch将执行cmdA输出作为命令(在大多数情况下应该失败),然后将其输出输出到cmdB。您可能是指watch 'cmdA | cmdB'

  2. 别名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

最新更新