命令 cd 行为

命令 cd 行为

从 ubuntu 17.10 开始,我的脚本不再像以前那样工作:

cd a*

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

bash: cd: too many arguments

我猜现在它会检测到多个参数,因为有多个以 开头的目录,a并会抛出错误。我该如何将 的行为改为cd以前的方式?

答案1

这看起来像是 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;如果更新不能解决问题,您必须重复上述过程。

答案2

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

提出的解决方法是创建一个基于内置cd命令的函数,该函数会覆盖其行为:

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

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

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

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

相关内容