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

kil*_*les 40 linux bash shell

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

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Ben*_*ebe 58

别名并不意味着这样做,但您可以创建一个名为的函数cd,它是真实cd. 这个对我有用!只需将其放入您.bash_profile或您选择的配置文件中即可。

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }
Run Code Online (Sandbox Code Playgroud)

或者,使用注释和漂亮的格式:

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
}
Run Code Online (Sandbox Code Playgroud)

编辑

感谢@derobert 指出if then else这里比&& ||. 另外,我刚刚意识到 ( *facepalm *) 只有当任何非路径参数(即-L -P)不是第一个参数时,这个实现才会起作用。所以要注意,如果你有打字的坏习惯,cd -L ,,这对你没有帮助。我认为,正确处理这件事并非易事。

  • @BenjiWiebe 我认为如果使用 if-then-else,“评论和漂亮格式”版本会更好。 (16认同)
  • 此外,从技术上讲,`..` 不一定是第一个参数;`bash` 中的 `cd` 可以采用多种选项(`-P`、`-L`、`-@`、`-e`)。 (8认同)

sty*_*fly 44

ZSH:

如果zsh alias -g ,,=".."您正在使用的是您所需要的,但这将导致“,,”到处扩展,而不仅仅是与cd.

来自man zshbuiltins

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

巴什:

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

根据要求,这是一个纯别名解决方案,但是这将超出要求,可能会让用户感到沮丧(请参阅我帖子末尾的警告)。

引用man bash

如果别名值的最后一个字符是空白,则还检查别名之后的下一个命令字的别名扩展。

因此,cd用一个额外的空格(以允许扩展其下一个参数)作为别名就足够了,然后别名,,... 看到那个

alias cd='cd '
alias ,,='..'
Run Code Online (Sandbox Code Playgroud)

正是您所需要的。

请注意,这不仅适用于bash(及其alias实现),而且适用于所有 POSIX 兼容 shell。引用一个例子man 1p alias(手册没有明确描述这个特性,只是通过一个例子):

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

           alias nohup="nohup "
    
    Run Code Online (Sandbox Code Playgroud)

警告: 如在他的评论@PeterCordes写操作时,会自动事业时后写别名扩大cd。它可能会要求你写cd \grep,如果你想改变目录到一个名为grep但你grep是一个别名grep --color=auto。没有反斜杠,cd会报“too many arguments”错误(你不能同时cd进入两个目录)!。

  • 这是一个聪明但讨厌的黑客。我不想那样做;太容易不小心咬到你了。例如,如果您有一个通常运行的命令的别名,并且您想将 `cd` 放入其源代码的目录中。或者您的别名和公共目录名称之间的其他冲突。就像`cd dr` 会扩展为`cd disown -r` 对我来说,使用这个别名。无论如何,最好用 IMO 这样的函数覆盖内置的 `cd`。 (22认同)
  • +1 纯别名解决方案(我学到了一些东西)。同时,我同意彼得的评论。我认为应该在您的答案中添加某种明确的警告。 (8认同)

Ste*_*ven 29

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

Bash 参考手册:别名

一个词用作简单命令的一个词时,别名允许用一个字符串替换一个词

您可以将..和都别名,,cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
Run Code Online (Sandbox Code Playgroud)

  • +1,这根本不是一个坏主意。在 Bash 中为 `..` 执行此操作的另一种方法是使用 `shopt -s autocd`,它可以让您只需输入其名称即可切换到任何目录。当然你还是`,,`的别名 (10认同)