Ubuntu 17.04 — bash: cd: 参数太多

Hid*_*ats 11 command-line bash cd-command

我刚刚将我的 Ubuntu 16.04 升级到 17.04,发现cd命令有点问题。

假设我有两个文件夹:album-01&album-02

在 Ubuntu 16.04 中,如果我这样做cd album*,它将转到找到的第一个文件夹album-01

但是在新的 Ubuntu 17.04 中,如果我这样做cd album*会导致我 -bash: cd: too many arguments

如何cdcd在 Ubuntu 16.04 中一样在 Ubuntu 17.04中制作?

Byt*_*der 10

我还无法在真正的 17.04 系统上对此进行测试(仅验证它可以在 16.04 上运行),但是您应该能够cd使用自己的自定义函数覆盖Bash 内置命令,该函数会丢弃除第一个参数之外的任何其他参数:

cd(){ command cd "$1" ; }
Run Code Online (Sandbox Code Playgroud)

更新:正如@muru's comment所建议的那样,下面的这个版本可能会更好地工作,并且支持cd无参数调用:

cd(){ builtin cd "${@:1:1}"; }
Run Code Online (Sandbox Code Playgroud)

在终端中输入上面的这一行后,请验证cd现在是否按照您想要的方式运行。如果是这种情况,您可以通过将该行附加到~/.bashrc文件末尾来使此函数定义持久化。否则,一旦您结束当前的 shell 会话,它就会消失。

请注意,如果由于某种原因您暂时需要使用真正的cdBash 内置命令而不是这个自定义函数,您可以简单地使用command cd而不是普通调用它cd

  • @SandiHidayat 试试 `cd () { 内置 cd "${@:1:1}"; }` 代替。 (2认同)

Gra*_*ent 7

简短回答/解决方法

在这种情况下回答您的问题,这是有效的

cd album*1
Run Code Online (Sandbox Code Playgroud)

但这可能不是您真正想要的功能。

发生了什么变化?

似乎config-top.h在 Bash-4.4 中已更新以添加以下选项

/* Define CD_COMPLAINS if you want the non-standard, but sometimes-desired
   error messages about multiple directory arguments to `cd'. */

#define CD_COMPLAINS
Run Code Online (Sandbox Code Playgroud)

builtins/cd.def在此处引用您的错误:

#if defined (CD_COMPLAINS)
  else if (list->next)
    {
      builtin_error (_("too many arguments"));
      return (EXECUTION_FAILURE);
    }
#endif
Run Code Online (Sandbox Code Playgroud)

我可以长期做什么?:

您可以在bash没有新CD_COMPLAINS的情况下自行编译,但这会变得乏味。您可以cd像这里建议的那样重新定义功能,或者您可以将函数别名为

cd "$(find $1* | head -1)"
Run Code Online (Sandbox Code Playgroud)

证明它

Bash 4.4 Beta 仍然有效

#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4-beta.tar.gz
$ tar -xzvf bash-4.4-beta.tar.gz
$ cd bash-4.4-beta

#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4-beta$ ./configure
~/bash-4.4-beta$ make

#Check Version
~/bash-4.4-beta$ ./bash --version
GNU bash, version 4.4.0(1)-beta (x86_64-unknown-linux-gnu)

#Enter a clean interactive prompt
~/bash-4.4-beta$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc

#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album* && pwd
/home/gkent/bash-4.4-beta/album0-1
Run Code Online (Sandbox Code Playgroud)

Bash 4.4 稳定版无法正常工作

#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
$ tar -zxvf bash-4.4.tar.gz
$ cd bash-4.4/

#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4$ ./configure
~/bash-4.4$ make

#Check Version
~/bash-4.4$ ./bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)

#Enter a clean interactive prompt
~/bash-4.4$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc

#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album*
bash: cd: too many arguments
Run Code Online (Sandbox Code Playgroud)


Eld*_*eek 5

我从来没有遇到过这个问题,因为我总是使用Tab Completion。

因此,在您的情况下,与其对我想要的目录有不准确的猜测,我会输入cd alTab哪个,如果只有一个匹配项,则完成它,如果有 2 个或更多项,则匹配结束并TabTab列出选项。

这是我系统中的一个示例:

cd Un Tab

cd Unknown
Run Code Online (Sandbox Code Playgroud)

其次是TabTab产生

Unknown/                        Unknown Artist - Unknown Album/ 
Run Code Online (Sandbox Code Playgroud)