Ubuntu 17.04 - bash: cd: занадто багато аргументів


10

Я щойно модернізував свій 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?


4
Те, що ви отримуєте, має сенс, оскільки ви надаєте cdдві локації та якось очікуєте, що це зрозуміє, яке саме ви хочете.
mikew незалежно від того,

1
@mikew Що б, на жаль, посібник Баша не погоджується з вами: "Будь-які додаткові аргументи, наступні за каталогом , ігноруються"
muru

3
Опублікував звіт про помилку, якщо хтось зацікавився: bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru

Будь ласка, не забудьте прийняти відповідь, яка вам найбільше допомогла, натиснувши на сіру круглу кнопку зліва, якщо ваше питання вирішено задовільно.
Байт-командир

Відповіді:


9

Я ще не міг перевірити це на реальній системі 17.04 (лише перевірив, що вона працює 16.04), але ви повинні мати змогу замінити cdвбудовану команду Bash за допомогою власної власної функції, яка відкидає будь-які додаткові аргументи, окрім першого :

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

Оновлення: Як запропоновано в коментарі @ muru , ця версія нижче може працювати краще і підтримує дзвінки cdбез аргументів:

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

Після того, як ви ввели цей рядок вище у своєму терміналі, будь ласка, перевірте, чи cdзараз він веде себе так, як вам потрібно. У такому випадку ви можете зробити визначення цієї функції стійким, додавши цей рядок до кінця ~/.bashrcфайлу. Інакше він зникне, як тільки ви закінчите свій поточний сеанс оболонки.

Зауважте, що якщо з будь-якої причини вам тимчасово потрібно використовувати справжню cdвбудовану команду Bash замість цієї спеціальної функції, ви можете просто викликати її command cdзамість простої cd.


Я писав те саме, замість функції я пропонував псевдонім до крихітного сценарію ... впевнений, що він працює;)
Ravexina

@Ravexina Я також подумав спочатку використовувати псевдонім, але потім відмовився від цього, тому що я думаю, що це не можна зробити з псевдонімом, оскільки там у вас немає контролю над аргументами. Що з цікавості ви запропонували б?
Байт командир

Я зробив те саме, я просто вклав код у .shфайл, потім створив псевдонім на зразок:mcd="source /home/user/bin/cd.sh"
Ravexina

А, добре. Це трохи складніше, ніж потрібно, але це також має працювати.
Командир байт

2
Спробуйте cd () { builtin cd "${@:1:1}"; }замість цього @SandiHidayat
muru

7

Коротка відповідь / Обхід

Щоб відповісти на ваше запитання саме в цьому випадку, це працює

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)"

Доведення це

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

Вибачте, був помилковим. Оновлена ​​відповідь.
Грейсон Кент

Ага, правильно. Ви могли просто зробити cd alb*1, щоб відповідати буквальному 1в кінці навіть без дужок. Я спочатку переплутав вашу ідею з чимось іншим.
ilkkachu

5

Я ніколи не стикався з цією проблемою, оскільки завжди використовую « Завершення вкладки».

Тож, у вашому випадку, замість того, щоб неточно здогадуватися, до якого каталогу я хочу, я б набрав, cd alTabякий, якщо є лише одна відповідність, завершує його, а якщо є 2 і більше завершує до того, де збігання закінчується, і TabTabперераховує вибір.

Ось приклад з моєї системи:

cd Un Tab

cd Unknown

Слідом за TabTabпродуктами

Unknown/                        Unknown Artist - Unknown Album/ 

2

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

(Ця відповідь була вперше опублікована на це повторне запитання .)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.