Ubuntu 17.04 – bash:cd:参数太多了

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

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

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

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

如何在Ubuntu 17.04中制作cd ,就像Ubuntu 16.04中的cd一样?

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

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

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

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

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

请注意,如果由于某种原因您暂时需要使用真正的cd Bash内置命令而不是此自定义函数,则可以使用command cd而不是普通cd来调用它。

简答/解决方法

要在这个确切的情况下回答您的问题,这是有效的

 cd album*1 

但它可能不是你真正想要的function。

改变了什么?

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

 /* 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 

我可以长期做什么?:

您可以在没有新的CD_COMPLAINS的情况下编译自己的bash ,但这会变得乏味。 你可以像这里建议的那样重新定义cdfunction,或者你可以使用类似函数的别名

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

certificate它

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 

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

所以在你的情况下,我不会对我想要的目录进行不精确的猜测,而是输入cd al Tab ,如果只有一个匹配,则完成它,如果有2个或更多完成匹配结束的地方和Tab Tab列出选择。

这是我系统的一个例子:

cd Un Tab

 cd Unknown 

然后Tab Tab产生

 Unknown/ Unknown Artist - Unknown Album/ 

这看起来像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  Thu, 04 Jan 2018 21:11:22 +0900 

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

然后你可以运行debuild命令,如果一切顺利(可以忽略有关debsign错误)你应该在父目录中有一些.deb ,你可以照常安装(没有必要安装所有这些,只是你现在拥有的;使用dpkg -l | grep bash来查找)。

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

(这个答案首先发布在这个重复的问题上 。)