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


41

有时,当我想更改到父目录时,我错误地键入cd ,,而不是cd ..。有没有一种方法可以使bash认为这些语句相同?我从不在命令中使用逗号。理想情况下,我想别名,,..。当我尝试此操作时,它不起作用。为什么没有这项工作?我还能如何解决这个问题?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
别名是要运行的程序,而不是程序的参数。所以$ ,,会抱怨,因为这样的:bash: ..: Is a directory。(换句话说,它不是可执行文件。)
jpaugh

5
@jpaugh:一种更清晰的说法是:别名扩展仅发生在命令的第一个“单词”上。因此,正如您所说,它仅适用于命令名称,不适用于args。(而且您甚至无法alias 'cd ,,'='cd ..'。嗯,可以,但是您必须运行它cd\ ,,以使其全部成为一个词。)
Peter Cordes

5
考虑zsh。它具有全球性的别名,所以alias -g ,,=..cd ,,你期望它的工作原理。
muru

1
横向思考:find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight

2
恕我直言:不要这样做。使用别名掩盖印刷错误是一个坏习惯。这些错误可能最终会导致复制粘贴的代码或屏幕录像。在其他主机或帐户中将无法使用。这样的修改(取决于实现方式)可能导致其他意外的,难以调试的错误。我的建议:如果您键入错误的命令,只需再次键入它即可;-)。
jjmontes'5

Answers:


45

ZSH:

如果zsh alias -g ,,=".."您使用的是所需的内容,但这将导致“,”扩展到任何地方,不仅是与一起使用cd

来自man zshbuiltins

如果该 -g 标志存在,则定义一个全局别名;即使全局别名不在命令位置出现,它们也会被扩展。

重击:

如果仅限于bash(因为问题用标记),请阅读以下内容:

根据要求,这是一个纯别名的解决方案,但是这样做会超出使用户感到沮丧的要求(请参阅我文章结尾的警告)。

报价man bash

如果别名值的最后一个字符为空,则还将检查别名后面的下一个命令字以进行别名扩展。

因此cd,使用多余的空间别名(足以扩展其下一个参数),然后将别名别名,,为足够..。看到那个

alias cd='cd '
alias ,,='..'

给出您所需要的。

请注意,这不仅对bash(及其alias实现)正确,而且对所有POSIX编译器外壳都是正确的。引用一个示例man 1p alias(手册没有通过一个示例明确描述此功能):

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

           alias nohup="nohup "

警告: 正如@PeterCordes在其评论中所写,当在之后编写时,它将自动导致其他别名扩展cdcd \grep如果您想将目录更改为一个已命名的目录,grep但您grep是的别名,则可能需要您写grep --color=auto。没有反斜杠,cd将报告“参数过多”错误(您不能cd一次到两个目录)!


22
这是一个聪明但讨厌的技巧。我不想那样做。太容易让你不小心咬你了。例如,如果您具有通常运行的命令的别名,并且想要cd进入其源代码的目录。或别名和通用目录名称之间的其他冲突。就像cd dr将扩大到cd disown -r对我来说,这个别名。无论如何,最好cd用IMO这样的函数来覆盖内置函数。
彼得·科德斯

8
+1为纯别名解决方案(我学到了一些东西)。同时,我同意彼得的评论。我认为,应该在您的答案中添加某种明确的警告。
卡米尔Maciorowski

58

别名并不是要这样做,但是您可以创建一个称为cdreal的包装器的函数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这里比这里更好&& ||。另外,我刚刚意识到(* facepalm *)该实现仅在任何非路径参数(即-L -P)不是第一个参数时才起作用。因此请注意,如果您有不良的打字习惯,cd -L ,,这将无济于事。我认为,正确处理这并非不容易。


16
@BenjiWiebe我认为如果使用if-then-else,“注释和漂亮的格式”版本会更好。
zwol

哇,好主意。我看到您正在使用编辑功能来处理所需的修复程序。我没有花很多时间测试它。:)
BenjiWiebe

1
另外,也可以$1在执行内置命令之前覆盖:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}",否则您在第一个参数之后会丢失任何内容。
chepner '17

8
同样,从技术上讲,..也不必成为第一个论点。cdbash可采取的各种选项(-P-L-@-e)。
chepner '17

29

别名必须是命令的第一个单词。同样,别名必须替换一个单词,因此不能有空格)。

Bash参考手册:别名

别名允许将字符串替换为简单命令的一个单词时使用该单词

你可以别名都..,,cd ..

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

那正是我的工作!:D这两个点/逗号比cd ..
–rav_kr

10
+1,这根本不是一个坏主意。.. 在Bash中完成此操作的另一种方法是,shopt -s autocd您可以通过输入名称来切换到任何目录。当然,您仍然是,,
ilkkachu


3

..更改目录的另一种方法是启用Bash的autocd 功能

shopt -s autocd 

输入名称之一将自动更改目录:

~$ /tmp
cd /tmp
/tmp$ 

您仍然必须为其创建别名,,,但是只需使用alias ,,=..


2

已经一个用于该脚本的应用程序https : //github.com/shyiko/commacd(与Stanley Shuyiko无关)。

commacd导出三个命令:(,用于向前跳跃),,,(向后)和,,,(向后+向前):

他们三个都首先尝试通过前缀匹配。只有找不到结果,它们才会回退到子字符串(模糊)匹配

为了回答您的问题,脚本别名用逗号定义了三个函数:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.