别名在 .bashrc 中无法按预期工作,而命令可以

别名在 .bashrc 中无法按预期工作,而命令可以

如果我通过 shell 执行以下操作,它将按预期工作,即,找到最后修改的文件并使用以下命令输出它cat

aux="$(find  /home/w/Dropbox/notes/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" ")"; cat "${aux}"

然而,如果我尝试将其分配给 .bashrc 中的别名,它不起作用(我不确定它的作用,似乎cat正在使用该命令,因为我被提示输入文本)。这是别名,在“”之间精确复制粘贴:

 alias readlast="aux="$(find  /home/w/Dropbox/notes/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" ")"; cat "${aux}""

请注意,直接通过 shell 分配时它确实有效,但我希望它是一个永久别名。

非常感谢您的宝贵时间。

答案1

问题的语法突出显示应该会向您显示哪里出错了:别名以双引号开头,然后您使用另一个双引号,关闭原始双引号,因此命令替换(以及稍后的“${aux}”)是在创建别名时而不是在运行时评估的。因此,如果您运行alias readlast,它看起来会像这样:

alias readlast="aux=<name-of-file>; cat "

当然"${aux}"是空的,因为在创建别名时没有设置它。这就是为什么cat它等待输入 - 没有文件名,它只会回显标准输入。

您可以通过对整个别名定义使用单引号(并从别名中删除单引号)来修复此问题:

alias readlast='aux="$(find /home/w/Dropbox/notes/ -type f -printf "%T@ %p\n" | sort -n | tail -1 | cut -f2- -d" ")"; cat "${aux}"'

或者使用函数:

readlast()
{
    aux="$(find /home/w/Dropbox/notes/ -type f -printf '%T@ %p\n' |
      sort -n |
      tail -1 |
      cut -f2- -d" ")"
    cat "${aux}"
}

附注:您可以使用以下命令简化管道sed

readlast()
{
    aux="$(find /home/w/Dropbox/notes/ -type f -printf '%T@ %p\0' |
      sort -zrn |
      sed -z 's/[0-9.]* //; q')"
    cat "${aux}"
}

\0in-printf-zfor sort/sed中,输入是用 ASCII NUL 字符而不是换行符分隔的。它是路径中唯一无效的字符,因此它是处理文件名和路径最安全的字符。使用-r,sort将为您反转顺序,然后命令sed将删除时间戳并在输入第一行后退出。

相关内容