我们将机器人的结果创建到不同的文件夹中,格式为“结果-yyyy dd-hh-mm-ss”,目前我的bash_aliases中有这样的结果。
alias res="VAR=$(ls --directory /path/to/results/res* | tail -n 1); cd $" 它曾经很好..。然后我必须重新装上我的bashrc才能让它再次工作。试着把重装烘焙成一个新的别名,但在切换到新的文件夹之前,仍然需要使用2-3次。
发布于 2020-07-27 13:09:02
双引号允许在定义时计算别名内容--使用单引号将计算推迟到运行时:
alias res='var=$(ls --directory /path/to/results/res* | tail -n 1); cd $var'另请参阅:
发布于 2020-07-28 13:26:04
使用ls的问题是,某些东西必须解析ls的输出,这被广泛认为是一件坏事。您会得到一些奇怪的文件名,其中包含tail可能会碰到的换行符和其他奇怪之处。
您可以通过简单的glob扩展来做您想做的事情:
for i in /path/to/res-*/; do :; done; cd "$i"这实际上只是在事情列表中滴答作响,除了将其赋值给变量i之外,什么也不做。当它完成循环时,它只使用i的最后一个值。它不是很聪明,但它应该提供多达几百万个节点的可接受的性能。
正如其他人所建议的,您可以在~/.bashrc中将其化名为
alias res='for i in /path/to/res-*/; do :; done; cd "$i"'发布于 2020-07-28 19:57:18
不要为比缩写命令的名称或将默认参数传递给命令更复杂的事情使用别名。使用函数代替。你会省去很多头痛的。
res () {
local latest
latest="$(ls --directory /path/to/results/res* | tail -n 1)" && cd "$latest"
}local声明将变量保持在函数的局部变量中,因此它不会干扰函数外定义的同名变量。&&可以确保在cd失败时不会执行,因为没有匹配的文件。local声明和分配给latest的任务在单独的指令中。否则,local latest="$(…)"的状态将为0,即使$(…)中的命令失败。您的尝试没有起作用,因为在定义别名时,VAR=$(…)中的命令替换和cd $VAR中的变量替换都是计算出来的。如果使用单引号,则在运行别名时会计算引号中的确切字符串,在本例中可以使用。不过,我不建议使用别名,即使它可以正常工作,因为函数的正确使用要简单得多。
https://askubuntu.com/questions/1262410
复制相似问题