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?
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
.
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.
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
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 al
Tab 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/
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 .deb
s 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 .)