',,' 可以别名为 '..' 吗?

',,' 可以别名为 '..' 吗?

有时当我想切换到父目录时,我会错误地输入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(手册没有明确描述此功能,仅通过一个例子):

  1. 设置 nohup 以便它可以处理本身是别名的参数:

           alias nohup="nohup "
    

警告: 正如@PeterCordes在他的评论中所写,它将自动导致其他在 后面写入 时,别名会展开。如果您想将目录更改为名为 的目录,则cd可能需要您写入,但您的是 的别名。如果没有反斜杠,将报告“参数过多”错误(您无法同时更改两个目录)!。cd \grepgrepgrepgrep --color=autocdcd

答案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

别名必须是第一个字命令。此外,别名必须替换为一个字因此没有空格)。

Bash 参考手册:别名

别名允许用字符串替换一个字当它被用作第一个字一个简单的命令。

您可以将..,,都设为别名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

相关内容