watch命令别名扩展


67

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

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

以下命令将失败

# watch ll
sh: ll: command not found

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

Answers:


98

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

bashhelp alias

扩展别名时,VALUE中的尾随空格会导致检查下一个单词以替代别名。

为此,请尝试以下操作:

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

请记住,watch默认情况下,某些版本的条形颜色可以使用--color或停止-G


1
这是绝对棒的答案!谢谢,当然要+1。
ztank1013 2011年

1
谢谢...在这段时间里,我习惯于1.键入ll,2.按ctrl + alt + e,3.然后给watch加上前缀。这可以节省时间。
阿西沙内

10
不幸的是,此方法有一个局限性,您不能提供选项,watch因为别名必须是下一个单词,而watch在运行命令之前需要它的参数。如果您尝试过watch -n 10 <alias>,bash不会扩展别名。要解决此问题,您需要一个别名,其中包含所需的选项(例如,alias watch-10 ='watch -n 10'),但仍带有尾随空格。
indiv

2

也许我们可以在手表看到之前手动扩展别名?

watch $(alias ll | cut -d\' -f2)

说明

输出的内容alias ll如下:

$ alias ll
alias ll='ls -lAGh'

因此,我们将cut的delimeter设置为单引号,然后剪切第二个字段,剩下:

ls -lAGh

即扩展别名。进而形成给予ARGS watch

做一个函数来做

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

然后,

watcha ll

根据需要工作。这太糟糕了,在各种情况下都会失败。抱歉。


0

我以为这里的基本问题是在执行时watch,将参数赋给“ sh -c”,这意味着如果llsh(dash shell's)环境中未定义别名,则不会扩展它。但是我错了,事实并非如此,克里斯在上面的回答是正确的。


2
不完全是。尝试watch 'alias ll="ls -l --color=tty"; type ll; ll'
克里斯·

+1立即响应以进行验证。我在上面错了。
2011年

@ChrisDown,因此即使手表使用“ sh -c”,您的说明也适用sh。我对吗?
2011年

1
这取决于正在使用什么shell sh。请注意,这确实有效:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
克里斯·唐纳

0

已经watch运行一个新的交互shell,这将扩大别名:

watch -x bash -i -c ll

-x旨在停止watch使用其自身sh -c来包装给定的命令。我们不希望这样做,因为我们需要传递-ishbash,以使其成为一个交互式外壳,该外壳读取.bashrc并定义别名。使用-x,watch执行使用exec命令。)

加,实际上,这是行不通的。在显示“ ll”的输出一次之后,然后休眠2秒钟,该作业将变为背景,但有点神秘:

1]+  Stopped                 watch -x bash -i -c ll

为什么停止了?撑开支架[去了哪里?恩,我认为这将是一个很好的答案,但我无法使其正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.