linux - 有没有办法只使用一次命令行的重复部分?
问题描述
我需要经常使用复数命令序列,例如:
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中更“临时”地在当前命令行中使用重复的命令行部分?
解决方案
对于 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
推荐阅读
- sql - SQL - 查询层次结构以确定责任
- javascript - Javascript计算器应用程序中的前导零和小数
- c - getopt() 解析模式不起作用
- graylog2 - Graylog 停止记录异常
- centos - MEAN Stack 在 CentOS 6.10 上不起作用(多个错误)
- xpath - 如何在 inspect.exe 中获取绝对 Xpath
- c# - ASP.Net Core 2.1 注册自定义 ClaimsPrincipal
- kotlin - 在 kotlin 中乘以双打(浮点错误?)
- javascript - 如何使节点模块在浏览器中可用,如 *socket.io* 确实
- javascript - 如何在我的整个应用程序中使用 angularjs 的变量