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* это дает мне -bash: cd: too many arguments

Как сделать cd в Ubuntu 17.04, как cd в Ubuntu 16.04?

9
задан 4 January 2018 в 23:34

20 ответов

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

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

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

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

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

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

8
ответ дан 22 May 2018 в 23:31
  • 1
    Я писал то же самое, вместо функции я предлагал псевдоним крошечному скрипту ... уверен, что он работает;) – Ravexina 17 April 2017 в 17:50
  • 2
    @Ravexina Я тоже сначала использовал псевдоним, но потом отбросил это, потому что я думаю, что это невозможно сделать с псевдонимом, потому что там у вас нет контроля над аргументами. Просто из любопытства, какой подход вы бы предложили? – Byte Commander 17 April 2017 в 17:52
  • 3
    Я сделал то же самое, я просто поместил код в файл .sh, затем создал псевдоним вроде: mcd="source /home/user/bin/cd.sh" – Ravexina 17 April 2017 в 17:54
  • 4
    Ах хорошо. Это немного сложнее, чем нужно, но должно работать. – Byte Commander 17 April 2017 в 17:56
  • 5
    @SandiHidayat Попробуйте cd () { builtin cd "${@:1:1}"; }. – muru 18 April 2017 в 12:12

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

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

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

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

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

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

8
ответ дан 18 July 2018 в 14:46

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

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

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

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

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

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

8
ответ дан 24 July 2018 в 20:28

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

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

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

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

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

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

8
ответ дан 31 July 2018 в 11:57

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

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

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

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

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

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

8
ответ дан 31 July 2018 в 23:31

Краткий ответ / Временное решение

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

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

И config-top.h ссылается на вашу ошибку здесь:

#if defined (CD_COMPLAINS)
  else if (list->next)
    {
      builtin_error (_("too many arguments"));
      return (EXECUTION_FAILURE);
    }
#endif

Что я могу сделать в долгосрочной перспективе?:

Вы можете скомпилировать свой bash без нового [d9 ] Что я могу сделать в долгосрочной перспективе?: , но это будет утомительно. Вы можете переопределить функциональность 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
7
ответ дан 22 May 2018 в 23:31
  • 1
    Извините, была опечатка. Обновленный ответ. – Grayson Kent 17 April 2017 в 22:52
  • 2
    Ах, да. Вы могли бы просто сделать cd alb*1, чтобы соответствовать буквальному 1 в конце, даже без скобок. Сначала я смутил вашу идею чем-то другим. – ilkkachu 17 April 2017 в 23:54

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

Итак, в вашем случае, вместо того, чтобы иметь неточное представление о том, какой каталог я хочу, я бы набрал cd al Tab, если есть только одно совпадение, завершает его, и если есть 2 или более завершений до того, где заканчивается совпадение, а TabTab перечисляет варианты.

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

[ f4] Tab

cd Unknown

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

Unknown/                        Unknown Artist - Unknown Album/ 
4
ответ дан 22 May 2018 в 23:31

Это выглядит как ошибка в 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, также должно работать и на других).

Сначала создайте каталог для работы, например: [ ! d6]

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
[d9 ] к этому

/* #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 s в родительском каталог, который вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash, чтобы узнать).

Обратите внимание, что номер версии нового пакет установлен таким образом, что вы автоматически получите какое-либо будущее обновление bash; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

now

2
ответ дан 22 May 2018 в 23:31

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

Итак, в вашем случае, вместо того, чтобы иметь неточное представление о том, какой каталог я хочу, я бы набрал cd al Tab, если есть только одно совпадение, завершает его, и если есть 2 или более завершений до того, где заканчивается совпадение, а TabTab перечисляет варианты.

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

cd Un Tab

cd Unknown

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

Unknown/ Unknown Artist - Unknown Album/
4
ответ дан 18 July 2018 в 14:46

Это выглядит как ошибка в 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, также должно работать и на других).

Сначала создайте каталог для работы, например: [ ! d6] 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 s в родительском каталог, который вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash, чтобы узнать).

Обратите внимание, что номер версии нового пакет установлен таким образом, что вы автоматически получите какое-либо будущее обновление до bash; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

now

2
ответ дан 18 July 2018 в 14:46

Краткий ответ / Временное решение

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

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

И config-top.h ссылается на вашу ошибку здесь:

#if defined (CD_COMPLAINS) else if (list->next) { builtin_error (_("too many arguments")); return (EXECUTION_FAILURE); } #endif

Что я могу сделать в долгосрочной перспективе?:

Вы можете скомпилировать свой bash без нового Что я могу сделать в долгосрочной перспективе?: , но это будет утомительно. Вы можете переопределить функциональность 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
7
ответ дан 18 July 2018 в 14:46

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

Итак, в вашем случае, вместо того, чтобы иметь неточное представление о том, какой каталог я хочу, я бы набрал cd al Tab, если есть только одно совпадение, завершает его, и если есть 2 или более завершений до того, где заканчивается совпадение, а TabTab перечисляет варианты.

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

cd Un Tab

cd Unknown

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

Unknown/ Unknown Artist - Unknown Album/
4
ответ дан 24 July 2018 в 20:28

Это выглядит как ошибка в 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, также должно работать и на других).

Сначала создайте каталог для работы, например: [ ! d6] 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 s в родительском каталог, который вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash, чтобы узнать).

Обратите внимание, что номер версии нового пакет установлен таким образом, что вы автоматически получите какое-либо будущее обновление bash; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

now

2
ответ дан 24 July 2018 в 20:28

Краткий ответ / Временное решение

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

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

И config-top.h ссылается на вашу ошибку здесь:

#if defined (CD_COMPLAINS) else if (list->next) { builtin_error (_("too many arguments")); return (EXECUTION_FAILURE); } #endif

Что я могу сделать в долгосрочной перспективе?:

Вы можете скомпилировать свой bash без нового Что я могу сделать в долгосрочной перспективе?: , но это будет утомительно. Вы можете переопределить функциональность 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
7
ответ дан 24 July 2018 в 20:28
  • 1
    Извините, была опечатка. Обновленный ответ. – Grayson Kent 17 April 2017 в 22:52
  • 2
    Ах, да. Вы могли бы просто сделать cd alb*1, чтобы соответствовать буквальному 1 в конце, даже без скобок. Сначала я смутил вашу идею чем-то другим. – ilkkachu 17 April 2017 в 23:54

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

Итак, в вашем случае, вместо того, чтобы иметь неточное представление о том, какой каталог я хочу, я бы набрал cd al Tab, если есть только одно совпадение, завершает его, и если есть 2 или более завершений до того, где заканчивается совпадение, а TabTab перечисляет варианты.

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

cd Un Tab

cd Unknown

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

Unknown/ Unknown Artist - Unknown Album/
4
ответ дан 31 July 2018 в 11:57

Это выглядит как ошибка в 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, также должно работать и на других).

Сначала создайте каталог для работы, например: [ ! d6] 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 s в родительском каталог, который вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash, чтобы узнать).

Обратите внимание, что номер версии нового пакет установлен таким образом, что вы автоматически получите какое-либо будущее обновление до bash; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

now

2
ответ дан 31 July 2018 в 11:57

Краткий ответ / Временное решение

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

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

И config-top.h ссылается на вашу ошибку здесь:

#if defined (CD_COMPLAINS) else if (list->next) { builtin_error (_("too many arguments")); return (EXECUTION_FAILURE); } #endif

Что я могу сделать в долгосрочной перспективе?:

Вы можете скомпилировать свой bash без нового Что я могу сделать в долгосрочной перспективе?: , но это будет утомительно. Вы можете переопределить функциональность 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
7
ответ дан 31 July 2018 в 11:57
  • 1
    Извините, была опечатка. Обновленный ответ. – Grayson Kent 17 April 2017 в 22:52
  • 2
    Ах, да. Вы могли бы просто сделать cd alb*1, чтобы соответствовать буквальному 1 в конце, даже без скобок. Сначала я смутил вашу идею чем-то другим. – ilkkachu 17 April 2017 в 23:54

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

Итак, в вашем случае, вместо того, чтобы иметь неточное представление о том, какой каталог я хочу, я бы набрал cd al Tab, если есть только одно совпадение, завершает его, и если есть 2 или более завершений до того, где заканчивается совпадение, а TabTab перечисляет варианты.

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

cd Un Tab

cd Unknown

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

Unknown/ Unknown Artist - Unknown Album/
4
ответ дан 31 July 2018 в 23:31

Это выглядит как ошибка в 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, также должно работать и на других).

Сначала создайте каталог для работы, например: [ ! d6] 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 s в родительском каталог, который вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash, чтобы узнать).

Обратите внимание, что номер версии нового пакет установлен таким образом, что вы автоматически получите какое-либо будущее обновление до bash; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

now

2
ответ дан 31 July 2018 в 23:31

Краткий ответ / Временное решение

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

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

И config-top.h ссылается на вашу ошибку здесь:

#if defined (CD_COMPLAINS) else if (list->next) { builtin_error (_("too many arguments")); return (EXECUTION_FAILURE); } #endif

Что я могу сделать в долгосрочной перспективе?:

Вы можете скомпилировать свой bash без нового Что я могу сделать в долгосрочной перспективе?: , но это будет утомительно. Вы можете переопределить функциональность 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
7
ответ дан 31 July 2018 в 23:31
  • 1
    Извините, была опечатка. Обновленный ответ. – Grayson Kent 17 April 2017 в 22:52
  • 2
    Ах, да. Вы могли бы просто сделать cd alb*1, чтобы соответствовать буквальному 1 в конце, даже без скобок. Сначала я смутил вашу идею чем-то другим. – ilkkachu 17 April 2017 в 23:54

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

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