Ubuntu 17.04 — bash:cd:参数太多

Ubuntu 17.04 — bash:cd:参数太多

我刚刚将我的 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

如何cd在 Ubuntu 17.04 中像cd在 Ubuntu 16.04 中一样?

答案1

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

cd(){ command cd "$1" ; }

更新:正如建议的那样@muru 的评论但是,下面这个版本可能会更好用,并且支持cd不带参数的调用:

cd(){ builtin cd "${@:1:1}"; }

在终端中输入上述行后,请验证cd现在的行为是否符合您的要求。如果是这种情况,您可以通过将该行附加到文件末尾来使该函数定义持久化~/.bashrc。否则,它会在您结束当前 shell 会话后立即消失。

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

答案2

简短回答/解决方法

为了回答你在这个确切情况下的问题,这有效

cd album*1

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

有什么改变?

看起来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

builtins/cd.def指的是你的错误在这里:

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

我能长期做什么?:

你可以自己编译,bash不需要新的CD_投诉,但这样会很繁琐。您可以cd像这里建议的那样重新定义功能,也可以为函数添加别名,例如

cd "$(find $1* | head -1)"

证明这一点

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

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

答案3

我从来没有遇到过这个问题,因为我一直使用Tab 补全。

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

以下是我的系统中的一个例子:

cd Un Tab

cd Unknown

随后TabTab产生

Unknown/                        Unknown Artist - Unknown Album/ 

答案4

这看起来像是 Bash 中的一个错误:按照man builtins旧的行为是正确的。

   cd [-L|[-P [-e]] [-@]] [dir]
              Change the current directory to dir.  if dir is not supplied,
              the  value  of  the  HOME shell variable is the default.  Any
              additional arguments following dir are ignored.

您可以在邮件列表中报告该错误bug-bash;更多详细信息这里


实际上,这个错误已经报告了(很久以前)。如果你现在想要一个修复的 Bash,那么现在,现在,这里是正确的操作方法(在 17.10 上测试过,应该也适用于其他版本)。

首先创建一个工作目录,例如:

mkdir ~/bash
cd ~/bash

获取源包和构建依赖项:

apt-get source bash
sudo apt-get build-dep bash
cd bash-4.4

编辑config-top.h以更改此内容(应为第 32 行)

#define CD_COMPLAINS

对此

/* #define CD_COMPLAINS */

编辑debian/changelog并在顶部添加如下条目(您也可以使用命令dch -i):

bash (4.4-5ubuntu1+cd) artful; urgency=medium

  * Fix cd.

 -- Firas Kraiem <[email protected]>  Thu, 04 Jan 2018 21:11:22 +0900

最重要的几点是附加+foo当前的版本号(foo可以是任意小写字母的字符串;使用时请小心dch -i,它会增加最后一个数字,因此您需要将其恢复为当前数字)并使用正确的发布名称(artful此处)。最后,运行dpkg-source --commit

然后,您可以运行该debuild命令,如果一切顺利(debsign可以忽略有关错误),您应该.deb在父目录中有一些 s,您可以像往常一样安装它们(不需要全部安装,只需安装您现在拥有的那些;用来dpkg -l | grep bash找出答案)。

请注意,新软件包的版本号已设置,以便您自动获取任何将来的更新bash;如果更新不能解决问题,您必须重复上述过程。

(此答案最初发布于这个重复的问题

相关内容