Ubuntu 17.04 - bash: cd: zbyt wiele argumentów

10

Właśnie zaktualizowałem Ubuntu 16.04 do 17.04 i znalazłem mały problem z cdpoleceniem.

Powiedzmy, że mam dwa foldery: album-01ialbum-02

W Ubuntu 16.04, jeśli to zrobię cd album*, przejdzie do pierwszego znalezionego folderualbum-01

Ale w nowym Ubuntu 17.04, jeśli to zrobię, cd album*to wynik -bash: cd: too many arguments

Jak zrobić cdw Ubuntu 17.04 jak cdw Ubuntu 16.04?

Chaty
źródło
4
To, co dostajesz, ma sens, ponieważ podajesz cddwie lokalizacje i w jakiś sposób oczekujesz, że zdecyduje, którą z nich chcesz.
mikewhthing
1
@mikewhthing Niestety, instrukcja Bash nie zgadza się z tobą: „Wszelkie dodatkowe argumenty w poniższym katalogu są ignorowane”
muru
3
Wysłał
muru
Nie zapomnij zaakceptować odpowiedzi, która najbardziej Ci pomogła, klikając szary okrągły przycisk wyboru po lewej stronie, jeśli twoje pytanie zostało rozwiązane w sposób satysfakcjonujący.
Bajt Dowódca

Odpowiedzi:

9

Nie mogłem jeszcze przetestować tego na prawdziwym systemie 17.04 (tylko zweryfikowałem, że działa on na 16.04), ale powinieneś być w stanie zastąpić cdwbudowane polecenie Bash własną funkcją niestandardową, która odrzuca wszelkie dodatkowe argumenty oprócz pierwszego :

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

Aktualizacja: Jak sugerowano w komentarzu @ muru , ta wersja poniżej może działać lepiej i obsługiwać wywoływanie cdbez argumentów:

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

Po wprowadzeniu tej linii powyżej w terminalu sprawdź, czy cdteraz działa tak, jak chcesz. W takim przypadku można uczynić tę funkcję trwałą, dodając tę ​​linię na końcu ~/.bashrcpliku. W przeciwnym razie zniknie, gdy tylko zakończysz bieżącą sesję powłoki.

Zauważ, że jeśli z jakiegokolwiek powodu musisz tymczasowo użyć prawdziwej cdwbudowanej komendy Bash zamiast tej funkcji niestandardowej, możesz po prostu wywołać ją command cdzamiast zwykłej cd.

Bajt Dowódca
źródło
Piszę to samo, zamiast funkcji sugerowałem alias do małego skryptu ... na pewno działa;)
Ravexina 17.04.17
@Ravexina Zastanawiałem się najpierw nad użyciem aliasu, ale potem go porzuciłem, ponieważ myślę, że nie można tego zrobić z aliasem, ponieważ tam nie masz kontroli nad argumentami. Po prostu z ciekawości, jakie podejście zaproponowałbyś?
Bajt Dowódca
Zrobiłem to samo, po prostu umieściłem kod w .shpliku, a następnie utworzyłem alias:mcd="source /home/user/bin/cd.sh"
Ravexina
Ach, okej Jest to nieco bardziej skomplikowane, niż powinno być, ale powinno również działać.
Bajt Dowódca
2
@SandiHidayat Spróbuj cd () { builtin cd "${@:1:1}"; }zamiast tego.
mur 18.04.17
7

Krótka odpowiedź / obejście

Aby odpowiedzieć na twoje pytanie w tym konkretnym przypadku, działa

cd album*1

Ale prawdopodobnie nie jest to funkcjonalność, której naprawdę chcesz.

Co się zmieniło?

Wygląda na to, że config-top.hw Bash-4.4 został zaktualizowany, aby dodać następującą opcję

/* Define CD_COMPLAINS if you want the non-standard, but sometimes-desired
   error messages about multiple directory arguments to `cd'. */

#define CD_COMPLAINS

I builtins/cd.defodnosi się do twojego błędu tutaj:

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

Co mogę zrobić długoterminowo ?:

Możesz skompilować swój własny bashbez nowych CD_COMPLAINS , ale byłoby to uciążliwe. Możesz ponownie zdefiniować cdfunkcjonalność, jak to sugerowano tutaj, lub możesz aliasować taką funkcję

cd "$(find $1* | head -1)"

Udowadniając to

Bash 4.4 Beta tam, gdzie nadal działa

#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 Wersja stabilna tam, gdzie nie działa

#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
Grayson Kent
źródło
Przepraszam, była literówka. Zaktualizowana odpowiedź.
Grayson Kent
Ah, tak. Możesz po prostu cd alb*1dopasować literał 1na końcu, nawet bez nawiasów. Na początku pomyliłem twój pomysł z czymś innym.
ilkkachu
5

Nigdy nie spotkałem się z tym problemem, ponieważ zawsze używam Uzupełniania tabulatorów.

Więc w twoim przypadku, zamiast nieprecyzyjnego zgadywania, który katalog chcę, piszę, cd alTabktóry, jeśli jest tylko jedno dopasowanie, uzupełnia go, a jeśli są 2 lub więcej uzupełnia do miejsca, w którym dopasowanie kończy się i TabTabzawiera listę opcji.

Oto przykład z mojego systemu:

cd Un Tab

cd Unknown

a następnie TabTabprodukuje

Unknown/                        Unknown Artist - Unknown Album/ 
Starszy Geek
źródło
2

To wygląda jak błąd w Bash: według man builtinsstarego zachowanie jest prawidłowe.

   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.

Możesz zgłosić błąd na bug-bashliście mailingowej; więcej szczegółów tutaj .


Faktycznie błąd został zgłoszony (dawno temu). Jeśli chcesz teraz naprawić Bash, teraz, teraz , jak to zrobić poprawnie (testowane 17.10, powinno działać również na innych).

Najpierw utwórz katalog do pracy, na przykład:

mkdir ~/bash
cd ~/bash

Pobierz pakiet źródłowy i zależności kompilacji:

apt-get source bash
sudo apt-get build-dep bash
cd bash-4.4

Edytuj, config-top.haby to zmienić (powinna być linia 32)

#define CD_COMPLAINS

do tego

/* #define CD_COMPLAINS */

Edytuj debian/changelogi dodaj taki wpis u góry (możesz także użyć polecenia 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

Najważniejsze punkty to dołączenie +foodo bieżącego numeru wersji ( foomoże to być dowolny ciąg małych liter; i uważaj, jeśli go użyjesz dch -i, zwiększy on ostatni numer, więc musisz przywrócić go do obecnego) i użyć poprawna nazwa wydania ( artfultutaj). Wreszcie biegnij dpkg-source --commit.

Następnie możesz uruchomić debuildpolecenie, a jeśli wszystko pójdzie dobrze (błędy debsignmożna zignorować), powinieneś mieć trochę .debs w katalogu nadrzędnym, który możesz zainstalować jak zwykle (nie ma potrzeby instalowania wszystkich, tylko tych już teraz; użyj, dpkg -l | grep bashaby się dowiedzieć).

Zauważ, że numer wersji nowego pakietu jest ustawiony tak, że będziesz automatycznie otrzymywać wszelkie przyszłe aktualizacje do bash; jeśli aktualizacja nie rozwiąże problemu, musisz powtórzyć powyższy proces.

(Ta odpowiedź została po raz pierwszy opublikowana na to zduplikowane pytanie ).

fkraiem
źródło