Ubuntu 17.04 – bash:cd:参数太多了
我刚刚将Ubuntu 16.04升级到17.04,发现cd
命令有点问题。
假设我有两个文件夹: album-01
和album-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
,但这会变得乏味。 你可以像这里建议的那样重新定义cd
function,或者你可以使用类似函数的别名
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
任何更新。 如果更新无法解决问题,则必须重复上述过程。
(这个答案首先发布在这个重复的问题上 。)