首页 > 解决方案 > 有没有办法只使用一次命令行的重复部分?

问题描述

我需要经常使用复数命令序列,例如:

xelatex a-tex-file.tex && xelatex a-tex-file.tex

创建一个乳胶目录。或者:

dot -Tpdf -o a-dot-file{.pdf,.dot} && evince a-dot-file.pdf

立即编译后查看pdf文件以检查我是否正确修改了点语言描述的图形文件。等等。

为了防止笔误,我想通过任何可能的方式使用重复的命令行部分(例如文件名),有点像:

xelatex a-tex-file.tex && xelatex $2

有可能

dot -Tpdf -o a-dot-file.pdf ${3%.*}.dot && evince $3

也许设置(位置)变量或制作脚本可以得到它,但我希望它可以尽可能少地改变环境,而且我认为为每个命令排列制作脚本或在每个命令上设置/取消设置变量是不明智的时间。

那么有没有办法在各种shell中更“临时”地在当前命令行中使用重复的命令行部分?

标签: linuxshell

解决方案


对于 bash,!#是您迄今为止键入的当前命令行的历史扩展。

$ echo foobar && !#:0 !#:1
echo foobar && echo foobar
foobar
foobar

第二个(带有大括号扩展)会很棘手,因为历史扩展发生大括号扩展之前,所以你必须做一些愚蠢的事情

$ dot -Tpdf a-dot-file{.dot,.pdf} && evince !#:2:s/{.dot,.pdf}/.pdf/

这绝对不值得打扰。你会为此使用一个函数:

dot-evince() {
    local pdf=${1/%.dot/.pdf}
    dot -Tpdf "$1" "$pdf" && evince "$pdf"
}

dot-evince a-dot-file.dot

推荐阅读