有时当我想切换到父目录时,我会错误地输入cd ,,
而不是cd ..
。 有没有办法让 bash 认为这些语句是相同的? 我从不在命令中使用逗号。 理想情况下,我想将 用作别名,,
。..
当我尝试这样做时,它不起作用。 为什么不起作用? 我还能如何解决这个问题?
$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
答案1
ZSH:
如果您使用的zsh
alias -g ,,=".."
就是您所需要的,但这会导致“,,”在任何地方都扩展,而不仅仅是在与一起使用时cd
。
从man zshbuiltins
:
如果
-g
存在该标志,则定义一个全局别名;即使全局别名没有出现在命令位置,也会被扩展。
重击:
如果仅限于bash
(因为问题被标记为狂欢), 阅读以下:
根据要求,这是一个纯别名解决方案,然而这将会超出要求,可能会让用户感到沮丧(请参阅我的帖子末尾的警告)。
引用man bash
:
如果别名值的最后一个字符是空格,那么还会检查别名后面的下一个命令字是否进行别名扩展。
cd
因此,用一个额外的空格作为别名(以允许扩展其下一个参数)然后将其别名,,
为就足够了..
。请参阅
alias cd='cd '
alias ,,='..'
给出了您所需要的。
请注意,这不仅适用于bash
(及其alias
实现),而且适用于所有符合 POSIX 的 shell。引用一个例子man 1p alias
(手册没有明确描述此功能,仅通过一个例子):
设置 nohup 以便它可以处理本身是别名的参数:
alias nohup="nohup "
警告:
正如@PeterCordes在他的评论中所写,它将自动导致其他在 后面写入 时,别名会展开。如果您想将目录更改为名为 的目录,则cd
可能需要您写入,但您的是 的别名。如果没有反斜杠,将报告“参数过多”错误(您无法同时更改两个目录)!。cd \grep
grep
grep
grep --color=auto
cd
cd
答案2
别名并非用于执行此操作,但您可以创建一个名为的函数,cd
它是真实函数的包装器cd
。这个对我有用!只需将其放入您的.bash_profile
或您选择的配置文件中即可。
cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }
或者,使用注释和漂亮的格式:
cd ()
{
if [ "$1" = ",," ]; then # if first argument is ",,"...
builtin cd .. # call the builtin cd with ".." instead...
else
builtin cd "$@" # else call builtin cd with original arguments
fi
}
编辑
感谢 @derobert 指出if then else
比 更好&& ||
。另外,我刚刚意识到(*捂脸*) 此实现仅在任何非路径参数(即-L -P
)不是第一个参数时才有效。因此请注意,如果您有不好的打字习惯,cd -L ,,
这将不会对您有所帮助。我认为,正确处理这一点并不容易。
答案3
别名必须是第一个字命令。此外,别名必须替换为一个字因此没有空格)。
别名允许用字符串替换一个字当它被用作第一个字一个简单的命令。
您可以将..
和,,
都设为别名cd ..
。
$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
答案4
已经有一个适用于该情况的应用程序脚本:https://github.com/shyiko/commacd(与 Stanley Shuyiko 无关)。
commacd
导出三个命令:,
(用于向前跳转)、,,
(向后) 和,,,
(向后+向前):这三个方法都首先尝试按前缀匹配。只有当找不到结果时,它们才会回退到子字符串(模糊)匹配
为了回答您的问题,脚本将逗号别名为它定义的三个函数:
alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward