如何在 bashrc 别名中转义命令?

如何在 bashrc 别名中转义命令?

我偶尔需要修改一个以当前时间戳为文件名的文件。我会这样做:

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"

相关内容