从 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