Vima Asked: 2020-07-28 04:30:25 +0800 CST2020-07-28 04:30:25 +0800 CST 2020-07-28 04:30:25 +0800 CST 别名转到文件夹中的最新文件夹 772 我们以“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 次。 bash alias 4 个回答 Voted Best Answer steeldriver 2020-07-28T05:09:02+08:002020-07-28T05:09:02+08:00 双引号允许在定义时评估别名内容 - 使用单引号将评估推迟到运行时: alias res='var=$(ls --directory /path/to/results/res* | tail -n 1); cd $var' 也可以看看: .bash_profile 中的命令返回过时的结果 date 命令在 bash 别名中无法正确解析 Oli 2020-07-29T05:26:04+08:002020-07-29T05:26:04+08:00 使用的问题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"' Gilles 'SO- stop being evil' 2020-07-29T11:57:18+08:002020-07-29T11:57:18+08:00 不要将别名用于比缩写命令名称或将默认参数传递给命令更复杂的事情。改用函数。你会省去很多麻烦。 res () { local latest latest="$(ls --directory /path/to/results/res* | tail -n 1)" && cd "$latest" } 该local声明将变量保持在函数的本地,因此它不会干扰在函数外部定义的同名变量。 Using&&确保如果由于没有匹配的文件而失败,cd则不会执行。ls local声明和赋值在单独的latest指令中。否则local latest="$(…)",即使里面的命令$(…)失败,状态也会为 0。 始终在变量和命令替换周围使用双引号,除非您知道为什么可以不使用它们。 您的尝试没有奏效,因为在定义别名时会评估命令替换VAR=$(…)和变量替换。cd $VAR如果您改用单引号,则在运行别名时会评估引号内的确切字符串,这在这种情况下会起作用。我不建议使用别名,即使它可以工作,因为函数更容易正确使用。 user986805 2020-12-19T03:29:05+08:002020-12-19T03:29:05+08:00 如果你打算只看一行,我建议你使用 builtinread res(){ read -r < <( \ ls -r --quoting-style=shell-escape /a/b/c*); eval cd "$REPLY" } 您可以将该函数放在 .bashrc 或 .bash_aliases 中。
双引号允许在定义时评估别名内容 - 使用单引号将评估推迟到运行时:
也可以看看:
.bash_profile 中的命令返回过时的结果
date 命令在 bash 别名中无法正确解析
使用的问题
ls
是必须解析 的输出ls
,这被广泛认为是一件坏事。你会得到奇怪的边缘情况,其文件名包含换行符和其他tail
可能会绊倒的怪事。您可以通过简单的全局扩展来做您想做的事情:
这本质上只是在事物列表中打勾,除了将其分配给变量之外什么都不做
i
。当它完成循环时,它只使用最后一个值i
。它不是很聪明,但它应该提供最多几百万个节点的可接受的性能。正如其他人所建议的那样,您可以在您的
~/.bashrc
不要将别名用于比缩写命令名称或将默认参数传递给命令更复杂的事情。改用函数。你会省去很多麻烦。
local
声明将变量保持在函数的本地,因此它不会干扰在函数外部定义的同名变量。&&
确保如果由于没有匹配的文件而失败,cd
则不会执行。ls
local
声明和赋值在单独的latest
指令中。否则local latest="$(…)"
,即使里面的命令$(…)
失败,状态也会为 0。您的尝试没有奏效,因为在定义别名时会评估命令替换
VAR=$(…)
和变量替换。cd $VAR
如果您改用单引号,则在运行别名时会评估引号内的确切字符串,这在这种情况下会起作用。我不建议使用别名,即使它可以工作,因为函数更容易正确使用。如果你打算只看一行,我建议你使用 builtin
read
您可以将该函数放在 .bashrc 或 .bash_aliases 中。