watch 命令别名扩展

watch 命令别名扩展

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

# alias ll
alias ll='ls -l --color=tty'

下面的命令会失败

# watch ll
sh: ll: command not found

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

答案1

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

来自bashhelp 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

我使用的另一个技巧(特别是用于别名kubectlk是创建符号链接而不是别名。这样符号链接仍然可以被找到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

相关内容