Hid*_*ats 11 command-line bash cd-command
我刚刚将我的 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像cd在 Ubuntu 16.04 中一样在 Ubuntu 17.04中制作?
Byt*_*der 10
我还无法在真正的 17.04 系统上对此进行测试(仅验证它可以在 16.04 上运行),但是您应该能够cd使用自己的自定义函数覆盖Bash 内置命令,该函数会丢弃除第一个参数之外的任何其他参数:
cd(){ command cd "$1" ; }
Run Code Online (Sandbox Code Playgroud)
更新:正如@muru's comment所建议的那样,下面的这个版本可能会更好地工作,并且支持cd无参数调用:
cd(){ builtin cd "${@:1:1}"; }
Run Code Online (Sandbox Code Playgroud)
在终端中输入上面的这一行后,请验证cd现在是否按照您想要的方式运行。如果是这种情况,您可以通过将该行附加到~/.bashrc文件末尾来使此函数定义持久化。否则,一旦您结束当前的 shell 会话,它就会消失。
请注意,如果由于某种原因您暂时需要使用真正的cdBash 内置命令而不是这个自定义函数,您可以简单地使用command cd而不是普通调用它cd。
在这种情况下回答您的问题,这是有效的
cd album*1
Run Code Online (Sandbox Code Playgroud)
但这可能不是您真正想要的功能。
似乎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
Run Code Online (Sandbox Code Playgroud)
并builtins/cd.def在此处引用您的错误:
#if defined (CD_COMPLAINS)
else if (list->next)
{
builtin_error (_("too many arguments"));
return (EXECUTION_FAILURE);
}
#endif
Run Code Online (Sandbox Code Playgroud)
我可以长期做什么?:
您可以在bash没有新CD_COMPLAINS的情况下自行编译,但这会变得乏味。您可以cd像这里建议的那样重新定义功能,或者您可以将函数别名为
cd "$(find $1* | head -1)"
Run Code Online (Sandbox Code Playgroud)
证明它
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我从来没有遇到过这个问题,因为我总是使用Tab Completion。
因此,在您的情况下,与其对我想要的目录有不准确的猜测,我会输入cd alTab哪个,如果只有一个匹配项,则完成它,如果有 2 个或更多项,则匹配结束并TabTab列出选项。
这是我系统中的一个示例:
cd Un Tab
cd Unknown
Run Code Online (Sandbox Code Playgroud)
其次是TabTab产生
Unknown/ Unknown Artist - Unknown Album/
Run Code Online (Sandbox Code Playgroud)