web-dev-qa-db-fra.com

Ubuntu 17.04 - bash: cd: trop d'arguments

Je viens de mettre à jour mon Ubuntu 16.04 à 17.04 et j'ai trouvé un petit problème avec la commande cd.

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 le nouvel Ubuntu 17.04, si je fais cd album*, le résultat m’apparaîtra -bash: cd: too many arguments

Comment créer cd dans Ubuntu 17.04 comme cd dans Ubuntu 16.04?

10
Hidayats

Je ne pouvais pas encore tester cela sur un vrai système 17.04 (seulement vérifier que cela fonctionnait le 16.04), mais vous devriez pouvoir remplacer la commande intégrée cd Bash avec votre propre fonction personnalisée, ce qui supprime tous les arguments supplémentaires à l'exception du premier. un:

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

Mise à jour: Comme suggéré dans le commentaire commentaire de @ mur , cette version ci-dessous pourrait mieux fonctionner et prendre en charge l'appel de cd sans arguments:

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

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

Notez que si, pour une raison quelconque, vous devez utiliser temporairement la commande intégrée réelle cd Bash au lieu de cette fonction personnalisée, vous pouvez simplement l'appeler avec command cd au lieu de plain cd.

9
Byte Commander

Réponse courte/Contournement

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

cd album*1

Mais ce n'est probablement pas la fonctionnalité que vous voulez 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 pouvez compiler votre propre bash sans le nouveau CD_COMPLAINS , mais cela deviendrait fastidieux. Vous pouvez redéfinir la fonctionnalité cd comme suggéré ici ou vous pouvez alias 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
7
Grayson Kent

Je n'ai jamais rencontré ce problème car je l'utilise toujours Completion onglet.

Donc, dans votre cas, plutôt que de deviner de façon imprécise le répertoire que je veux, je taperais cd alTab qui, s’il n’ya qu’une seule correspondance, la complète et s’il y a au moins deux finales jusqu’à la fin de la correspondance et TabTab liste les choix.

Voici un exemple de mon système:

cd Un Tab

cd Unknown

suivi par TabTab produit

Unknown/                        Unknown Artist - Unknown Album/ 
5
Elder Geek

Cela ressemble à un bogue dans Bash: pour man builtins l'ancien comportement est correct.

   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 liste de diffusion bug-bash; plus de détails ici .


En fait, le bogue a été signalé (il y a longtemps). Si vous voulez un Bash fixe maintenant, maintenant, maintenant , voici comment le faire correctement (testé sur 17.10, devrait également fonctionner avec d'autres).

Commencez par créer un répertoire dans lequel travailler:

mkdir ~/bash
cd ~/bash

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

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

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

#define CD_COMPLAINS

pour ça

/* #define CD_COMPLAINS */

Éditez debian/changelog et ajoutez une entrée comme celle-ci en haut (vous pouvez également utiliser la commande dch -i):

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

  * Fix cd.

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

Les points les plus importants sont d’ajouter +foo au numéro de version actuel (foo peut être n’importe quelle chaîne de lettres minuscules et soyez prudent si vous utilisez dch -i, le dernier chiffre sera incrémenté (vous devez donc le rétablir avec le nom actuel) et utiliser le nom correct de la version (artful ici). Enfin, exécutez dpkg-source --commit.

Vous pouvez ensuite exécuter la commande debuild et si tout se passe bien (les erreurs relatives à debsign peuvent être ignorées), vous devriez avoir quelques .debs dans le répertoire parent, que vous pouvez installer normalement (il n’est pas nécessaire de les installer tous. ceux que vous avez maintenant, utilisez dpkg -l | grep bash pour le découvrir).

Notez que le numéro de version du nouveau package est défini de sorte que vous obtiendrez automatiquement toute mise à jour future à 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 le cette question en double .)

2
fkraiem