Ubuntu 17.04 - bash: cd: troppi argomenti


10

Ho appena aggiornato Ubuntu 16.04 a 17.04 e ho riscontrato un piccolo problema con il cdcomando.

Diciamo che ho due cartelle: album-01&album-02

In Ubuntu 16.04, se lo faccio cd album*, andrà alla prima cartella trovataalbum-01

Ma nel nuovo Ubuntu 17.04, se lo faccio cd album*mi risulta -bash: cd: too many arguments

Come realizzare cdUbuntu 17.04 come cdin Ubuntu 16.04?


4
Ciò che ottieni ha senso, dato che dai cddue posizioni, e in qualche modo ti aspetti che capisca quale vuoi.
mikewhatever,

1
@mikewhatever Sfortunatamente, il manuale di Bash non è d'accordo con te: "Qualsiasi argomento aggiuntivo che segue la directory viene ignorato"
muru,

3
Ha
muru,

Per favore, non dimenticare di accettare la risposta che ti ha aiutato di più facendo clic sul pulsante di controllo rotondo grigio alla sua sinistra, se la tua domanda è risolta in modo soddisfacente.
Byte Commander

Risposte:


9

Non ho ancora potuto provare questo su un vero sistema 17.04 (verificato solo che funziona su 16.04), ma dovresti essere in grado di sovrascrivere il cdcomando integrato di Bash con la tua funzione personalizzata, che scarta qualsiasi argomento aggiuntivo tranne il primo :

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

Aggiornamento: Come suggerito nel commento di @ muru , questa versione di seguito potrebbe funzionare meglio e supportare la chiamata cdsenza argomenti:

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

Dopo aver inserito questa riga sopra nel terminale, si prega di verificare se cdora si comporta nel modo desiderato. In tal caso, è possibile rendere persistente questa definizione di funzione aggiungendo quella riga alla fine del ~/.bashrcfile. Altrimenti svanirà non appena si termina la sessione di shell corrente.

Nota che se per qualsiasi motivo hai temporaneamente bisogno di usare il vero cdcomando integrato di Bash invece di questa funzione personalizzata, puoi semplicemente chiamarlo con command cdinvece di plain cd.


Stavo scrivendo la stessa cosa, invece della funzione stavo suggerendo un alias per la sceneggiatura minuscola ... certo che funziona;)
Ravexina

@Ravexina Ho pensato di usare prima anche un alias, ma poi l'ho abbandonato perché penso che non possa essere fatto con un alias, perché lì non hai il controllo degli argomenti. Solo per curiosità, quale approccio avresti suggerito?
Byte Commander

Ho fatto la stessa cosa, ho appena inserito il codice in un .shfile, quindi ho creato un alias come:mcd="source /home/user/bin/cd.sh"
Ravexina,

Ah ok. È un po 'più complicato di quanto dovrebbe essere, ma dovrebbe funzionare anche.
Byte Commander

2
@SandiHidayat Prova cd () { builtin cd "${@:1:1}"; }invece.
muru,

7

Risposta breve / Soluzione alternativa

Per rispondere alla tua domanda in questo preciso caso, funziona

cd album*1

Ma probabilmente non è la funzionalità che desideri davvero.

Che cosa è cambiato?

Sembra che config-top.hin Bash-4.4 sia stato aggiornato per aggiungere la seguente opzione

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

#define CD_COMPLAINS

E si builtins/cd.defriferisce al tuo errore qui:

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

Cosa posso fare a lungo termine ?:

Potresti compilare il tuo bashsenza il nuovo CD_COMPLAINS , ma sarebbe noioso. Puoi ridefinire le cdfunzionalità come suggerito qui o puoi alias una funzione come

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

Provandolo

Bash 4.4 Beta dove funziona ancora

#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

Rilascio stabile di Bash 4.4 dove non funziona

#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

Scusa, è stato un errore di battitura. Risposta aggiornata.
Grayson Kent,

Ah giusto. Potresti semplicemente fare cd alb*1, per abbinare il letterale 1alla fine anche senza parentesi. All'inizio ho confuso la tua idea con qualcos'altro.
ilkkachu,

5

Non ho mai riscontrato questo problema poiché utilizzo sempre Tab Completion.

Quindi nel tuo caso, piuttosto che avere un'ipotesi imprecisa su quale directory desidero, digitarei cd alTabquale se c'è solo una corrispondenza, la completa e se ce ne sono 2 o più completa fino a dove termina la corrispondenza ed TabTabelenca le scelte.

Ecco un esempio dal mio sistema:

cd Un Tab

cd Unknown

seguito da TabTabproduce

Unknown/                        Unknown Artist - Unknown Album/ 

2

Sembra un bug in Bash: per man builtinsil vecchio comportamento è quello corretto.

   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.

Puoi segnalare il bug sulla bug-bashmailing list; maggiori dettagli qui .


In realtà, il bug è stato segnalato (molto tempo fa). Se vuoi un Bash fisso ora, ora, ora , ecco come farlo correttamente (testato su 17.10, dovrebbe funzionare anche su altri).

Innanzitutto crea una directory su cui lavorare, ad esempio:

mkdir ~/bash
cd ~/bash

Ottieni il pacchetto sorgente e le dipendenze di compilazione:

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

Modifica config-top.hper cambiarlo (dovrebbe essere la riga 32)

#define CD_COMPLAINS

a questa

/* #define CD_COMPLAINS */

Modifica debian/changeloge aggiungi una voce come questa in alto (puoi anche usare il comando 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

I punti più importanti sono aggiungere +fooal numero di versione corrente ( foopuò essere una qualsiasi stringa di lettere minuscole; e fai attenzione se lo usi dch -i, aumenterà l'ultimo numero, quindi devi ripristinarlo a quello corrente) e usare il nome di rilascio corretto ( artfulqui). Infine, corri dpkg-source --commit.

È quindi possibile eseguire il debuildcomando e se tutto va bene (gli errori su debsignpossono essere ignorati) dovresti avere alcuni .debs nella directory principale, che puoi installare come al solito (non è necessario installarli tutti, solo quelli che ora, usa dpkg -l | grep bashper scoprirlo).

Si noti che il numero di versione del nuovo pacchetto è impostato in modo da ricevere automaticamente eventuali aggiornamenti futuri bash; se l'aggiornamento non risolve il problema, è necessario ripetere la procedura sopra descritta.

(Questa risposta è stata pubblicata per la prima volta su questa domanda duplicata .)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.