命令cd行为

从ubuntu 17.10开始,我的脚本的工作方式与以前不同:

cd a* 

将目录更改为以a开头的第一个目录。 现在,我收到此错误:

 bash: cd: too many arguments 

我猜它现在检测到多个参数,因为多个目录以a开头并引发错误。 我怎么能改变cd的行为方式?

我发现了同样的问题: Ubuntu 17.04 – bash:cd:参数太多了 。 显然这是一个错误。

建议的解决方法是创建一个基于内置cd命令的函数来覆盖它的行为:

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

将上面的行放在脚本的开头,然后在Ubuntu 16.04中使用cd a* 。 如果要在子shell中使用它,请使用export -f cd

您也可以在~/.bashrc文件中定义和导出该函数:

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

这看起来像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任何更新。 如果更新无法解决问题,则必须重复上述过程。