11 votes

Ubuntu 17.04 - bash : cd : trop d'arguments

Je viens de mettre à jour mon Ubuntu 16.04 vers 17.04 et j'ai trouvé un petit problème avec les éléments suivants cd commandement.

Disons que j'ai deux dossiers : album-01 & album-02

Dans Ubuntu 16.04, si je fais cd album* il ira dans le premier dossier trouvé album-01

Mais dans la nouvelle Ubuntu 17.04, si je fais cd album* il me résulte -bash: cd: too many arguments

Comment faire cd dans Ubuntu 17.04 comme cd dans Ubuntu 16.04 ?

10voto

Byte Commander Points 99026

Je n'ai pas encore pu tester cela sur un vrai système 17.04 (j'ai seulement vérifié que cela fonctionnait sur 16.04), mais vous devriez être en mesure de remplacer l'option cd Commande intégrée à Bash avec votre propre fonction personnalisée, qui élimine tous les arguments supplémentaires sauf le premier :

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

Mise à jour : Comme suggéré dans Commentaire de @muru la version ci-dessous pourrait mieux fonctionner et supporter les appels. cd sans arguments cependant :

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

Après avoir saisi la ligne ci-dessus dans votre terminal, veuillez vérifier si cd se comporte maintenant comme vous le souhaitez. Si c'est le cas, vous pouvez rendre cette définition de fonction persistante en ajoutant cette ligne à la fin de votre fichier ~/.bashrc fichier. Sinon, il disparaîtra dès que vous terminerez votre session Shell en cours.

Notez que si, pour une raison quelconque, vous avez temporairement besoin d'utiliser l'authentique cd Bash au lieu de cette fonction personnalisée, vous pouvez simplement l'appeler avec command cd au lieu d'un simple cd .

7voto

Grayson Kent Points 1185

Réponse courte/contournement

Pour répondre à votre question dans ce cas précis, ceci fonctionne

cd album*1

Mais ce n'est probablement pas la fonctionnalité que vous souhaitez vraiment.

Qu'est-ce qui a changé ?

Il semble que config-top.h dans Bash-4.4 a été mis à jour pour ajouter l'option suivante

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

#define CD_COMPLAINS

Et builtins/cd.def fait référence à votre erreur ici :

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

Que puis-je faire à long terme ?

Vous pourriez compiler votre propre bash sans le nouveau CD_COMPLAINS mais cela deviendrait fastidieux. Vous pouvez redéfinir le cd comme suggéré ici ou vous pouvez aliaser une fonction comme

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

Le prouver

Bash 4.4 Beta où cela fonctionne toujours

#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 où cela ne fonctionne pas

#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

5voto

Elder Geek Points 34144

Je n'ai jamais rencontré ce problème car j'utilise toujours Complément d'onglet.

Donc, dans votre cas, plutôt que de deviner de façon imprécise quel répertoire je veux, je taperais cd alTab qui, s'il n'y a qu'une seule correspondance, la complète et s'il y en a 2 ou plus, la complète jusqu'à la fin de la correspondance et TabTab énumère les choix possibles.

Voici un exemple tiré de mon système :

cd Un Tab

cd Unknown

suivi par TabTab produit

Unknown/                        Unknown Artist - Unknown Album/

3voto

fkraiem Points 11558

Cela ressemble à un bug dans Bash : per man builtins l'ancien comportement est le bon.

   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.

Vous pouvez signaler le bogue sur la page bug-bash liste de diffusion ; plus de détails これ .


En fait, le bogue a été signalé (il y a longtemps). Si vous voulez un Bash corrigé maintenant, c'est maintenant, maintenant Voici comment le faire correctement (testé sur la version 17.10, devrait fonctionner sur d'autres).

Créez d'abord un répertoire dans lequel vous pourrez travailler, par exemple :

mkdir ~/bash
cd ~/bash

Obtenir le paquet source et les dépendances de construction :

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

Modifier config-top.h pour changer ceci (devrait être la ligne 32)

#define CD_COMPLAINS

à ce

/* #define CD_COMPLAINS */

Modifier debian/changelog et ajoutez une entrée comme celle-ci en haut (vous pouvez aussi utiliser la commande 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

Les points les plus importants sont d'ajouter +foo zum actuel numéro de version ( foo peut être n'importe quelle chaîne de lettres minuscules ; et faites attention si vous utilisez dch -i il incrémentera le dernier numéro, vous devez donc revenir au numéro actuel) et d'utiliser le nom de version correct ( artful ici). Enfin, exécutez dpkg-source --commit .

Vous pouvez alors exécuter le debuild et si tout se passe bien (erreurs de debsign peuvent être ignorées), vous devriez avoir .deb s dans le répertoire parent, que vous pouvez installer comme d'habitude (il n'est pas nécessaire de tous les installer, juste ceux que vous avez maintenant ; utilisez la commande dpkg -l | grep bash pour le savoir).

Notez que le numéro de version du nouveau paquet est défini de telle sorte que vous recevrez automatiquement toute mise à jour future de bash ; si la mise à jour ne résout pas le problème, vous devez répéter le processus ci-dessus.

(Cette réponse a été publiée pour la première fois sur cette question en double .)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X