Ubuntu 17.04 - bash: cd: zu viele Argumente


10

Ich habe gerade mein Ubuntu 16.04 auf 17.04 aktualisiert und ein kleines Problem mit dem cdBefehl gefunden.

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

Wenn ich cd album*es in Ubuntu 16.04 mache , wird es in den ersten gefundenen Ordner verschobenalbum-01

Aber in neuem Ubuntu 17.04, wenn ich es tue cd album*, resultiere ich -bash: cd: too many arguments

Wie mache ich cdin Ubuntu 17.04 wie cdin Ubuntu 16.04?


4
Was Sie bekommen, macht Sinn, da Sie cdzwei Standorte angeben und irgendwie erwarten, dass es herausfindet, welchen Sie möchten.
Mike, was auch immer

1
@mikewhatever Leider stimmt das Bash-Handbuch nicht mit Ihnen überein: "Alle zusätzlichen Argumente, die dem Verzeichnis folgen, werden ignoriert"
muru

3
Gepostet einen Fehlerbericht, falls jemand interessiert ist: bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru

Bitte vergessen Sie nicht, die Antwort zu akzeptieren, die Ihnen am meisten geholfen hat, indem Sie auf die graue runde Check-Schaltfläche links klicken, wenn Ihre Frage zufriedenstellend gelöst ist.
Byte Commander

Antworten:


9

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

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

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

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

Nachdem Sie diese Zeile oben in Ihrem Terminal eingegeben haben, überprüfen Sie bitte, ob Sie sich cdjetzt wie gewünscht verhalten. In diesem Fall können Sie diese Funktionsdefinition dauerhaft machen, indem Sie diese Zeile an das Ende Ihrer ~/.bashrcDatei anhängen . Andernfalls verschwindet es, sobald Sie Ihre aktuelle Shell-Sitzung beenden.

Beachten Sie, dass Sie, wenn Sie aus irgendeinem Grund vorübergehend den echten integrierten cdBash-Befehl anstelle dieser benutzerdefinierten Funktion verwenden müssen, ihn einfach mit command cdstatt einfach aufrufen können cd.


Ich habe das Gleiche geschrieben, statt der Funktion habe ich einen Alias ​​für ein winziges Skript vorgeschlagen ... sicher, dass es funktioniert;)
Ravexina

@Ravexina Ich habe auch überlegt, zuerst einen Alias ​​zu verwenden, diesen dann aber fallen gelassen, weil ich denke, dass dies mit einem Alias ​​nicht möglich ist, da Sie dort keine Kontrolle über die Argumente haben. Welchen Ansatz hätten Sie aus Neugier vorgeschlagen?
Byte Commander

Ich habe das gleiche getan, ich habe nur den Code in eine .shDatei mcd="source /home/user/bin/cd.sh"
eingefügt und

Ah, ok. Das ist etwas komplizierter als nötig, sollte aber auch funktionieren.
Byte Commander

2
@ SandiHidayat Versuchen Sie es cd () { builtin cd "${@:1:1}"; }stattdessen.
Muru

7

Kurze Antwort / Problemumgehung

Um Ihre Frage genau in 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.hin Bash-4.4 die folgende Option hinzugefügt wurde

/* 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.defverweist 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 Ihre eigenen bashohne die neuen CD_COMPLAINS kompilieren , aber das würde mühsam werden. Sie können die cdhier vorgeschlagene Funktionalität neu definieren oder eine Funktion wie

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

Es zu beweisen

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

Entschuldigung, war ein Tippfehler. Antwort aktualisiert.
Grayson Kent

Ah richtig. Sie könnten einfach tun cd alb*1, um das Literal 1am Ende auch ohne die Klammern abzugleichen. Ich habe Ihre Idee zuerst mit etwas anderem verwechselt.
Ilkkachu

5

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

In Ihrem Fall würde ich also, anstatt eine ungenaue Vermutung darüber zu haben, welches Verzeichnis ich möchte, welches eingeben, cd alTabwenn es nur eine Übereinstimmung gibt, diese vervollständigt und wenn es zwei oder mehr Vervollständigungen gibt, bis die Übereinstimmung endet und TabTabdie Auswahlmöglichkeiten auflistet.

Hier ist ein Beispiel aus meinem System:

cd Un Tab

cd Unknown

gefolgt von TabTabproduziert

Unknown/                        Unknown Artist - Unknown Album/ 

2

Dies sieht aus wie ein Fehler in Bash: Nach man builtinsdem alten Verhalten ist das richtige.

   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.

Sie können den Fehler auf der bug-bashMailingliste melden . Weitere Details hier .


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

Erstellen Sie zunächst 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 config-top.h, um dies zu ändern (sollte Zeile 32 sein)

#define CD_COMPLAINS

dazu

/* #define CD_COMPLAINS */

Bearbeiten debian/changelogund fügen Sie oben einen Eintrag wie diesen hinzu (Sie können auch den Befehl verwenden 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

Die wichtigsten Punkte sind das Anhängen +fooan die aktuelle Versionsnummer ( fookann eine beliebige Folge von Kleinbuchstaben sein; und seien Sie vorsichtig, wenn Sie diese verwenden dch -i, wird die letzte Nummer erhöht, sodass Sie sie auf die aktuelle zurücksetzen müssen) und verwenden Sie die korrekter Release-Name ( artfulhier). Zum Schluss laufen dpkg-source --commit.

Sie können dann den debuildBefehl ausführen , und wenn alles gut geht (Fehler debsignkö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, nur die, die Sie haben habe jetzt; benutze dpkg -l | grep bashum es herauszufinden).

Beachten Sie, dass die Versionsnummer des neuen Pakets so festgelegt ist, dass Sie bei zukünftigen Updates automatisch auf erhalten bash. Wenn das Update das Problem nicht behebt, müssen Sie den obigen Vorgang wiederholen.

(Diese Antwort wurde zuerst auf diese doppelte Frage gestellt .)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.