Ubuntu 17.04 - bash: cd: слишком много аргументов

Я только что обновил свой 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?

11
задан 4 January 2018 в 22:34

4 ответа

Я не мог пока не протестируйте это на реальной системе 17.04 (проверено только, что она работает 16.04), но вы должны иметь возможность переопределить встроенную команду cd Bash своей собственной пользовательской функцией, которая отбрасывает любые дополнительные аргументы, кроме первый:

cd(){ command cd "$1" ; }

Обновление: Как предлагается в комментарии @ muru , эта версия ниже может работать лучше и поддерживать вызов cd без аргументов:

cd(){ builtin cd "${@:1:1}"; }

После того, как вы вы ввели эту строку выше в свой терминал, проверьте, работает ли cd теперь так, как вы хотите. В этом случае вы можете сделать это определение функции постоянным, добавив эту строку в конец вашего файла ~ / .bashrc . В противном случае он исчезнет, ​​как только вы завершите текущий сеанс оболочки.

Обратите внимание, что если по какой-либо причине вам временно потребуется использовать реальную встроенную команду cd Bash вместо этой настраиваемой функции, вы можете просто вызовите его с помощью команды cd вместо обычного cd .

10
ответ дан 4 January 2018 в 22:34

Краткий ответ / обходной путь

Чтобы ответить на ваш вопрос в этом конкретном случае, это работает

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
7
ответ дан 4 January 2018 в 22:34

Я никогда не сталкивался с этой проблемой, так как всегда использую Завершение вкладки.

Поэтому в вашем случае, вместо того, чтобы иметь неточное предположение относительно того, какой каталог мне нужен, я бы набрал cd al Вкладка , которая, если есть только одно совпадение, завершает его, а если есть 2 или более, завершает до того места, где совпадение заканчивается, а Вкладка Вкладка перечисляет варианты.

Вот пример из моей системы:

cd Un Tab

cd Unknown

, за которым следует Tab Tab производит

Unknown/                        Unknown Artist - Unknown Album/ 
5
ответ дан 4 January 2018 в 22:34

Это похоже на ошибку в 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 ; если обновление не устраняет проблему, повторите описанный выше процесс.

(Этот ответ был впервые опубликован на этот повторяющийся вопрос .)

2
ответ дан 4 January 2018 в 22:34

Другие вопросы по тегам:

Похожие вопросы: