Я только что обновил свой Ubuntu 16.04 до 17.04 и обнаружил небольшую проблему с командой cd
.
Допустим, у меня есть две папки: album-01
& amp; album-02
В Ubuntu 16.04, если я сделаю cd album*
, он перейдет к первой найденной папке album-01
Но в новой Ubuntu 17.04, если я сделаю cd album*
, это приведет me -bash: cd: too many arguments
Как сделать cd
в Ubuntu 17.04 подобно cd
в Ubuntu 16.04?
Я не мог пока не протестируйте это на реальной системе 17.04 (проверено только, что она работает 16.04), но вы должны иметь возможность переопределить встроенную команду cd
Bash своей собственной пользовательской функцией, которая отбрасывает любые дополнительные аргументы, кроме первый:
cd(){ command cd "$1" ; }
Обновление: Как предлагается в комментарии @ muru , эта версия ниже может работать лучше и поддерживать вызов cd
без аргументов:
cd(){ builtin cd "${@:1:1}"; }
После того, как вы вы ввели эту строку выше в свой терминал, проверьте, работает ли cd
теперь так, как вы хотите. В этом случае вы можете сделать это определение функции постоянным, добавив эту строку в конец вашего файла ~ / .bashrc
. В противном случае он исчезнет, как только вы завершите текущий сеанс оболочки.
Обратите внимание, что если по какой-либо причине вам временно потребуется использовать реальную встроенную команду cd
Bash вместо этой настраиваемой функции, вы можете просто вызовите его с помощью команды cd
вместо обычного cd
.
Чтобы ответить на ваш вопрос в этом конкретном случае, это работает
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_COMPLAINS , но это будет утомительно. Вы можете переопределить функциональность cd
, как предлагается здесь, или использовать псевдоним функции, например
cd "$(find $1* | head -1)"
Proving it
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 Stable Release, где она не работает
#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
Я никогда не сталкивался с этой проблемой, так как всегда использую Завершение вкладки.
Поэтому в вашем случае, вместо того, чтобы иметь неточное предположение относительно того, какой каталог мне нужен, я бы набрал cd al
Вкладка , которая, если есть только одно совпадение, завершает его, а если есть 2 или более, завершает до того места, где совпадение заканчивается, а Вкладка Вкладка перечисляет варианты.
Вот пример из моей системы:
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.
Вы можете сообщить об ошибке в ошибке- список рассылки 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 <firas@fkraiem.org> Thu, 04 Jan 2018 21:11:22 +0900
Наиболее важные моменты - добавить + foo
на текущий номер версии ( foo
может быть любой строкой строчных букв; будьте осторожны, если вы используете dch -i
, последнее число будет увеличиваться, поэтому вам нужно вернуть его к текущему) и использовать правильное название выпуска (здесь artful
). Наконец, запустите dpkg-source --commit
.
Затем вы можете запустить команду debuild
, и если все пойдет хорошо (ошибки о debsign
могут быть игнорируется) у вас должно быть несколько .deb
в родительском каталоге, которые вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас; используйте dpkg - l | grep bash
, чтобы узнать).
Обратите внимание, что номер версии нового пакета установлен так, что вы автоматически получите любое будущее обновление для bash
; если обновление не устраняет проблему, повторите описанный выше процесс.
(Этот ответ был впервые опубликован на этот повторяющийся вопрос .)