Answers:
别名仅作为第一个参数扩展,或在命令末尾带有尾随空格的另一个别名之后扩展。
从bash
的help alias
:
扩展别名时,VALUE中的尾随空格会导致检查下一个单词以替代别名。
为此,请尝试以下操作:
alias watch='watch '
alias ll='ls -l --color=tty'
watch ll
请记住,watch
默认情况下,某些版本的条形颜色可以使用--color
或停止-G
。
watch
因为别名必须是下一个单词,而watch
在运行命令之前需要它的参数。如果您尝试过watch -n 10 <alias>
,bash不会扩展别名。要解决此问题,您需要一个别名,其中包含所需的选项(例如,alias watch-10 ='watch -n 10'),但仍带有尾随空格。
也许我们可以在手表看到之前手动扩展别名?
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
根据需要工作。这太糟糕了,在各种情况下都会失败。抱歉。
我以为这里的基本问题是在执行时watch
,将参数赋给“ sh -c
”,这意味着如果ll
在sh(dash shell's)
环境中未定义别名,则不会扩展它。但是我错了,事实并非如此,克里斯在上面的回答是正确的。
watch 'alias ll="ls -l --color=tty"; type ll; ll'
。
sh -c
”,您的说明也适用sh
。我对吗?
sh
。请注意,这确实有效:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
已经watch
运行一个新的交互shell,这将扩大别名:
watch -x bash -i -c ll
(-x
旨在停止watch
使用其自身sh -c
来包装给定的命令。我们不希望这样做,因为我们需要传递-i
给sh
或bash
,以使其成为一个交互式外壳,该外壳读取.bashrc并定义别名。使用-x
,watch执行使用exec命令。)
加,实际上,这是行不通的。在显示“ ll”的输出一次之后,然后休眠2秒钟,该作业将变为背景,但有点神秘:
1]+ Stopped watch -x bash -i -c ll
为什么停止了?撑开支架[
去了哪里?恩,我认为这将是一个很好的答案,但我无法使其正常工作。