bash 别名中的 date 命令无法正确解析

bash 别名中的 date 命令无法正确解析

我正在尝试建立一种方法,让我只需键入,然后在 的子目录中创建newjournal一个名为 的新日记条目。year-month-date-time.txtyear~/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'

将该别名定义视为三个字符串:

  1. 一个单引号字符串:'echo '
  2. 一个不带引号的字符串:$(date +%k%M)
  3. 一个单引号空字符串:''

相关内容