it-swarm.com.de

Ubuntu 17.04 - bash: cd: zu viele Argumente

Ich habe gerade mein Ubuntu 16.04 auf 17.04 aktualisiert und ein kleines Problem mit dem Befehl cd festgestellt.

Angenommen, ich habe zwei Ordner: album-01 & album-02

Wenn ich in Ubuntu 16.04 cd album* tue, wechselt es zum ersten gefundenen Ordner album-01

Aber im neuen Ubuntu 17.04, wenn ich cd album* mache, führt es zu -bash: cd: too many arguments

Wie mache ich cd in Ubuntu 17.04 wie cd in Ubuntu 16.04?

10
Hidayats

Ich konnte dies noch nicht auf einem echten 17.04-System testen (nur überprüft, dass es auf 16.04 funktioniert), aber Sie sollten in der Lage sein, den in cd Bash eingebauten Befehl mit Ihrer eigenen benutzerdefinierten Funktion zu überschreiben, die zusätzliche Funktionen verwirft Argumente außer dem ersten:

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

Update: Wie in @ murus Kommentar vorgeschlagen, funktioniert diese Version möglicherweise besser und unterstützt das Aufrufen von cd ohne Argumente obwohl:

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

Nachdem Sie diese Zeile in Ihrem Terminal eingegeben haben, überprüfen Sie, ob cd sich nun wie gewünscht verhält. In diesem Fall können Sie diese Funktionsdefinition persistent machen, indem Sie diese Zeile an das Ende Ihrer ~/.bashrc -Datei anhängen. Andernfalls verschwindet es, sobald Sie Ihre aktuelle Shell-Sitzung beenden.

Beachten Sie, dass Sie den eingebauten Befehl real cd Bash aus irgendeinem Grund einfach mit command cd anstelle von plain cd aufrufen können.

9
Byte Commander

Kurze Antwort/Problemumgehung

Um Ihre Frage in genau diesem Fall zu beantworten, funktioniert dies

_cd album*1
_

Aber es ist wahrscheinlich nicht die Funktionalität, die Sie wirklich wollen.

Was hat sich geändert?

Es scheint, dass config-top.h in Bash-4.4 aktualisiert wurde, um die folgende Option hinzuzufügen

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

#define CD_COMPLAINS
_

Und builtins/cd.def bezieht sich hier auf Ihren Fehler:

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

Was kann ich langfristig tun?:

Sie könnten Ihr eigenes bash ohne die neue CD_COMPLAINS kompilieren, aber das würde mühsam werden. Sie können die cd -Funktionalität wie hier vorgeschlagen neu definieren oder einen Alias ​​wie eine Funktion erstellen

_cd "$(find $1* | head -1)"
_

Beweisen Sie es

Bash 4.4 Beta, wo es noch funktioniert

_#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, wo es nicht funktioniert

_#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
Grayson Kent

Ich bin noch nie auf dieses Problem gestoßen, da ich immer Tab Completion. verwende

In Ihrem Fall würde ich also cd al eingeben, anstatt ungenau zu erraten, welches Verzeichnis ich haben möchte.Tab Wenn es nur eine Übereinstimmung gibt, wird sie abgeschlossen. Wenn es zwei oder mehr Übereinstimmungen gibt, wird sie abgeschlossen, bis die Übereinstimmung endet TabTab listet die Auswahlmöglichkeiten auf.

Hier ist ein Beispiel aus meinem System:

cd Un Tab

cd Unknown

gefolgt von TabTab produziert

Unknown/                        Unknown Artist - Unknown Album/ 
5
Elder Geek

Dies sieht aus wie ein Fehler in Bash: Laut man builtins ist das alte Verhalten das richtige.

   cd [-L|[-P [-e]] [[email protected]]] [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.

Sie können den Fehler in der Mailingliste bug-bash melden. Weitere Details hier .


Eigentlich wurde der Fehler gemeldet (vor langer Zeit). Wenn Sie jetzt, jetzt, jetzt einen festen Bash haben möchten, gehen Sie wie folgt vor (getestet am 17.10, sollte auch bei anderen funktionieren).

Erstellen Sie zuerst ein Verzeichnis, in dem Sie arbeiten möchten, zum Beispiel:

mkdir ~/bash
cd ~/bash

Holen Sie sich das Quellpaket und die Build-Abhängigkeiten:

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

Bearbeiten Sie config-top.h, um dies zu ändern (sollte Zeile 32 sein)

#define CD_COMPLAINS

dazu

/* #define CD_COMPLAINS */

Bearbeiten Sie debian/changelog und fügen Sie oben einen Eintrag wie diesen hinzu (Sie können auch den Befehl dch -i verwenden):

bash (4.4-5ubuntu1+cd) artful; urgency=medium

  * Fix cd.

 -- Firas Kraiem <[email protected]>  Thu, 04 Jan 2018 21:11:22 +0900

Die wichtigsten Punkte sind, +foo an die aktuelle Versionsnummer (foo can anzuhängen Seien Sie vorsichtig, wenn Sie dch -i verwenden. Dadurch wird die letzte Zahl inkrementiert. Sie müssen sie auf die aktuelle Zahl zurücksetzen und den korrekten Release-Namen (artful hier) verwenden. Führen Sie abschließend dpkg-source --commit aus.

Anschließend können Sie den Befehl debuild ausführen. Wenn alles in Ordnung ist (Fehler in Bezug auf debsign können ignoriert werden), sollten Sie einige .debs im übergeordneten Verzeichnis haben, die Sie wie gewohnt installieren können (es ist nicht erforderlich, alle zu installieren) sie, nur die, die du jetzt hast; benutze dpkg -l | grep bash, um herauszufinden).

Beachten Sie, dass die Versionsnummer des neuen Pakets so festgelegt ist, dass Sie künftige Aktualisierungen von bash automatisch erhalten. Wenn das Update das Problem nicht behebt, müssen Sie den obigen Vorgang wiederholen.

(Diese Antwort wurde zuerst am diese doppelte Frage gepostet.)

2
fkraiem