我刚刚将我的 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
如何cd
在 Ubuntu 17.04 中像cd
在 Ubuntu 16.04 中一样?
答案1
我尚未在真正的 17.04 系统上测试它(仅验证了它是否可以在 16.04 上运行),但您应该能够使用cd
您自己的自定义函数覆盖 Bash 内置命令,该函数将丢弃除第一个参数之外的任何其他参数:
cd(){ command cd "$1" ; }
更新:正如建议的那样@muru 的评论但是,下面这个版本可能会更好用,并且支持cd
不带参数的调用:
cd(){ builtin cd "${@:1:1}"; }
在终端中输入上述行后,请验证cd
现在的行为是否符合您的要求。如果是这种情况,您可以通过将该行附加到文件末尾来使该函数定义持久化~/.bashrc
。否则,它会在您结束当前 shell 会话后立即消失。
请注意,如果由于某种原因您暂时需要使用真正的cd
Bash 内置命令而不是这个自定义函数,那么您可以简单地用command cd
而不是普通的来调用它cd
。
答案2
简短回答/解决方法
为了回答你在这个确切情况下的问题,这有效
cd album*1
但它可能不是您真正想要的功能。
有什么改变?
看起来config-top.h
在 Bash-4.4 中已更新,添加了以下选项
/* 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
我能长期做什么?:
你可以自己编译,bash
不需要新的CD_投诉,但这样会很繁琐。您可以cd
像这里建议的那样重新定义功能,也可以为函数添加别名,例如
cd "$(find $1* | head -1)"
证明这一点
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
答案3
我从来没有遇到过这个问题,因为我一直使用Tab 补全。
因此,在您的情况下,我不会对我想要哪个目录做出不精确的猜测,而是会输入cd al
Tab如果只有一个匹配项则完成它,如果有两个或更多匹配项则完成直到匹配结束并TabTab列出选择。
以下是我的系统中的一个例子:
cd Un
Tab
cd Unknown
随后TabTab产生
Unknown/ Unknown Artist - Unknown Album/
答案4
这看起来像是 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
;如果更新不能解决问题,您必须重复上述过程。
(此答案最初发布于这个重复的问题。