从 ubuntu 17.10 开始,我的脚本不再像以前那样工作:
cd a*
Run Code Online (Sandbox Code Playgroud)
将目录更改为以a.开头的第一个目录。现在,我收到此错误:
bash: cd: too many arguments
Run Code Online (Sandbox Code Playgroud)
我想它现在检测到多个参数,因为多个目录以 开头a并抛出错误。我怎么能改变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.
Run Code Online (Sandbox Code Playgroud)
您可以在bug-bash邮件列表上报告错误;更多细节在这里。
实际上,该错误已报告(很久以前)。如果你现在想要一个固定的 Bash,现在,现在,这里是如何正确地做到这一点(在 17.10 上测试,应该也适用于其他人)。
首先创建一个目录来工作,例如:
mkdir ~/bash
cd ~/bash
Run Code Online (Sandbox Code Playgroud)
获取源包和构建依赖项:
apt-get source bash
sudo apt-get build-dep bash
cd bash-4.4
Run Code Online (Sandbox Code Playgroud)
编辑config-top.h以更改此设置(应为第 32 行)
#define CD_COMPLAINS
Run Code Online (Sandbox Code Playgroud)
对此
/* #define CD_COMPLAINS */
Run Code Online (Sandbox Code Playgroud)
编辑debian/changelog并在顶部添加这样的条目(您也可以使用命令dch -i):
bash (4.4-5ubuntu1+cd) artful; urgency=medium
* Fix cd.
-- Firas Kraiem <firas@fkraiem.org> Thu, 04 Jan 2018 21:11:22 +0900
Run Code Online (Sandbox Code Playgroud)
最重要的一点是附加+foo到当前版本号(foo可以是任何小写字母字符串;小心如果你使用dch -i,它会增加最后一个数字,所以你需要将它恢复到当前版本)并使用正确的版本名称(artful此处)。最后,运行dpkg-source --commit。
然后你可以运行debuild命令,如果一切顺利(关于错误debsign可以忽略)你应该.deb在父目录中有一些s,你可以像往常一样安装(没有必要安装所有的,只需要你现在有;dpkg -l | grep bash用来找出)。
请注意,新软件包的版本号已设置,以便您将自动获得未来的任何更新bash;如果更新不能解决问题,则必须重复上述过程。
我发现了同样的问题:Ubuntu 17.04 \xe2\x80\x94 bash: cd: Too much argument。显然这是一个错误。
\n\n建议的解决方法是根据cd覆盖其行为的内置命令创建一个函数:
cd(){ builtin cd "${@:1:1}"; }\nRun Code Online (Sandbox Code Playgroud)\n\n将以上行放入脚本的开头,然后cd a*像 Ubuntu 16.04 中一样使用。export -f cd如果您想在子 shell 中使用它,请使用它。
您也可以在文件中定义和导出该函数~/.bashrc:
cd(){ builtin cd "${@:1:1}"; }\nexport -f cd\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |