如果我通过 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}"
}
在\0
in-printf
和-z
for sort
/sed
中,输入是用 ASCII NUL 字符而不是换行符分隔的。它是路径中唯一无效的字符,因此它是处理文件名和路径最安全的字符。使用-r
,sort
将为您反转顺序,然后命令sed
将删除时间戳并在输入第一行后退出。