![如何在 bashrc 别名中转义命令?](https://linux22.com/image/1251057/%E5%A6%82%E4%BD%95%E5%9C%A8%20bashrc%20%E5%88%AB%E5%90%8D%E4%B8%AD%E8%BD%AC%E4%B9%89%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我偶尔需要修改一个以当前时间戳为文件名的文件。我会这样做:
touch `date "+%Y-%m-%d_%H-%M"`.txt
但是,我想为此定义一个别名。当我尝试将其添加到 bashrc 时:
alias td="touch `date \"+%Y-%m-%d_%H-%M\"`.txt"
结果是文件名在整个会话期间都是相同的,因为“日期..”在登录期间只计算一次......
如何让命令仅在调用别名时展开?还是必须为此使用函数?
谢谢
答案1
shell 会扩展包含alias
命令的命令行,并将类似以下内容传递td=touch 2010-09-17_21-54.txt
给命令alias
。您需要保护别名定义中的特殊字符不被扩展。最简单的方法是使用单引号而不是双引号:
alias td='touch `date "+%Y-%m-%d_%H-%M"`.txt'
然后是所需的td
别名。touch `date "+%Y-%m-%d_%H-%M"`.txt
虽然这不是问题,但我建议使用$(…)
而不是`…`
,以避免复杂命令的困难(反引号具有神秘且不可移植的引用规则,而美元括号则直观地工作):
alias td='touch $(date "+%Y-%m-%d_%H-%M").txt'
答案2
接受的答案几乎总是完美的。对于那些必须使用双引号而不是单引号的情况,以下方法有效:
alias td="touch \`date \"+%Y-%m-%d_%H-%M\"\`.txt"