我正在尝试建立一种方法,让我只需键入,然后在 的子目录中创建newjournal
一个名为 的新日记条目。year-month-date-time.txt
year
~/documents/journals
我已使用以下命令将其设置为别名:
alias newjournal='nano /home/username/documents/journals/'$(date +%Y)'/'$(date +%F-%k%M).txt''
因此,年份子文件夹解析正确,日期命令的前半部分似乎也解析正确。尝试使用 附加别名sudo
,但没有帮助。
问题:由于某种原因,当我执行此命令时,时间值(%k
)解析为几分钟前......或者可能是 nano 上次运行此文件名的时间,也许它被称为旧缓冲区?
当我注销时,它会生成正确的文件,然后我保存,等待几分钟并重试,它会编辑旧文件而不是创建新文件。即使我删除旧文件,它也会使用旧文件名(错误的时间)创建新文件。
以下是我试图解释的内容的屏幕截图。在这里,我创建了一个新日志,在执行命令后一两秒内将其保存在 nano 中,打印正确的日期/时间,列出创建的文件。请注意错误的文件名时间(1249,而不是 13:11):
无论如何,它可能很简单,但我在别名中尝试了不同的方法,例如用双引号括住整个内容并正确转义、单引号、转义和空格等。
感谢您的阅读/帮助。Ubuntu 16.04 服务器。
编辑:这是最终有效的别名:
alias newjournal='nano /home/user/journals/"$(date +%Y)"/"$(date +%F-%H%M).txt"'
需要在整个单引号别名内对日期命令进行双引号。
答案1
命令date
被评估当你声明别名时。
以下是一个示例别名t
:
$ alias t="echo \"$(date +%k%M)\""
$ alias t
alias t='echo "1357"'
您可以使用单引号修复此问题:
$ alias t='echo "$(date +%k%M)"'
$ alias t
alias t='echo "$(date +%k%M)"'
有关详细信息,请参阅For more info, seeBash 中单引号和双引号的区别
或者,如果命令不需要是别名,则可以改用函数:
$ function t { echo "$(date +%k%M)"; }
$ declare -f t
t ()
{
echo "$(date +%k%M)"
}
或者脚本:
#!/bin/sh
echo "$(date +%k%M)"
根据最近的编辑进行更新
$ alias t='echo '$(date +%k%M)''
$ alias t
alias t='echo 1400'
将该别名定义视为三个字符串:
- 一个单引号字符串:
'echo '
- 一个不带引号的字符串:
$(date +%k%M)
- 一个单引号空字符串:
''