我们将机器人结果创建到单独的文件夹中,格式为“result-yyyy-mm-dd-hh-mm-ss”,目前我的 bash_aliases 中有这个
alias res="VAR=$(ls --directory /path/to/results/res* | tail -n 1); cd $"
一次运行正常……然后我必须重新加载我的 bashrc 才能使其再次运行。尝试将重新加载到新别名中,但在切换到较新的文件夹之前,仍然必须使用 2-3 次。
答案1
双引号允许在定义时评估别名内容 - 使用单引号将评估推迟到运行时:
alias res='var=$(ls --directory /path/to/results/res* | tail -n 1); cd $var'
也可以看看:
答案2
使用的问题ls
在于,有些东西必须解析 的输出ls
,这被广泛认为是一件坏事。您会遇到奇怪的边缘情况,文件名包含换行符和其他tail
可能出错的奇怪内容。
你可以通过简单的全局扩展来做你想做的事情:
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"'
答案3
不要将别名用于比缩写命令名称或将默认参数传递给命令更复杂的事情。请改用函数。这样可以省去很多麻烦。
res () {
local latest
latest="$(ls --directory /path/to/results/res* | tail -n 1)" && cd "$latest"
}
- 声明
local
将变量保持在函数本地,因此它不会干扰函数外定义的同名变量。 - 使用
&&
确保如果由于没有匹配的文件而失败cd
则不会执行。ls
- 的声明
local
和赋值latest
是在单独的指令中。否则,即使内部命令失败,的状态local latest="$(…)"
也将为 0$(…)
。 - 始终在变量和命令替换周围使用双引号,除非您知道为什么可以不用它们。
您的尝试没有成功,因为在定义别名时会评估 中的命令替换VAR=$(…)
和 中的变量替换cd $VAR
。如果您改用单引号,则在运行别名时会评估引号内的确切字符串,这在本例中是可行的。尽管可以使其工作,但我不建议使用别名,因为函数更容易正确使用。
答案4
如果你只想读一行,我建议你使用内置read
res(){
read -r < <( \
ls -r --quoting-style=shell-escape /a/b/c*); eval cd "$REPLY"
}
您可以将函数放在 .bashrc 或 .bash_aliases 中。