Ubuntu 17.04 - bash: cd: demasiados argumentos

10

Acabo de actualizar mi Ubuntu 16.04 a 17.04 y encontré un pequeño problema con el cdcomando.

Digamos que tengo dos carpetas: album-01&album-02

En Ubuntu 16.04, si lo hago cd album*, iré a la primera carpeta encontradaalbum-01

Pero en el nuevo Ubuntu 17.04, si lo hago cd album*, me resultará -bash: cd: too many arguments

¿Cómo hacer cden Ubuntu 17.04 como cden Ubuntu 16.04?

Hidayats
fuente
44
Lo que obtienes tiene sentido, ya que le das cddos ubicaciones, y de alguna manera esperas que descubra cuál quieres.
mikewhatever
1
@mikewhatever Desafortunadamente, el manual de Bash no está de acuerdo con usted: "Cualquier argumento adicional que siga al directorio se ignora"
muru
3
Publiqué un informe de error, en caso de que alguien esté interesado: bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru
Si su pregunta se resuelve satisfactoriamente, no olvide aceptar la respuesta que más le ayudó haciendo clic en el botón de verificación redondo gris a su izquierda.
Byte Commander

Respuestas:

9

Todavía no pude probar esto en un sistema 17.04 real (solo verifiqué que funciona en 16.04), pero debería poder anular el cdcomando incorporado Bash con su propia función personalizada, que descarta cualquier argumento adicional excepto el primero :

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

Actualización: como se sugiere en el comentario de @ muru , esta versión a continuación podría funcionar mejor y admitir llamadas cdsin argumentos:

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

Después de haber ingresado esta línea arriba en su terminal, verifique si cdahora se comporta de la manera que desea. Si este es el caso, puede hacer que esta definición de función sea persistente agregando esa línea al final de su ~/.bashrcarchivo. De lo contrario, desaparecerá tan pronto como finalice su sesión de shell actual.

Tenga en cuenta que si por alguna razón necesita usar temporalmente el cdcomando incorporado Bash real en lugar de esta función personalizada, simplemente puede llamarlo con en command cdlugar de sin formato cd.

Byte Commander
fuente
Estaba escribiendo lo mismo, en lugar de función, estaba sugiriendo un alias para un script pequeño ... seguro que funciona;)
Ravexina
@Ravexina También consideré usar un alias primero, pero luego lo descarté porque creo que no se puede hacer con un alias, porque allí no tienes control sobre los argumentos. Solo por curiosidad, ¿qué enfoque hubieras sugerido?
Byte Commander
Hice lo mismo, solo puse el código en un .sharchivo y luego creé un alias como:mcd="source /home/user/bin/cd.sh"
Ravexina
Ah ok Eso es un poco más complicado de lo que debería ser, pero debería funcionar también.
Byte Commander
2
@SandiHidayat Intenta en su cd () { builtin cd "${@:1:1}"; }lugar.
muru
7

Respuesta corta / solución alternativa

Para responder a su pregunta en este caso exacto, esto funciona

cd album*1

Pero probablemente no sea la funcionalidad que realmente quieres.

¿Qué cambió?

Parece que config-top.hen Bash-4.4 se actualizó para agregar la siguiente opción

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

#define CD_COMPLAINS

Y se builtins/cd.defrefiere a su error aquí:

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

¿Qué puedo hacer a largo plazo ?:

Podrías compilar la tuya bashsin los nuevos CD_COMPLAINS , pero eso sería tedioso. Puede redefinir la cdfuncionalidad como se sugiere aquí o puede crear un alias de una función como

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

Probándolo

Bash 4.4 Beta donde aún funciona

#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 Versión estable donde no funciona

#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
Grayson Kent
fuente
Lo siento, fue un error tipográfico. Respuesta actualizada
Grayson Kent el
Ah bien. Podrías hacerlo cd alb*1, para que coincida con el literal 1al final, incluso sin los corchetes. Al principio confundí tu idea con algo más.
ilkkachu
5

Nunca me he encontrado con este problema, ya que siempre uso Tab Completion.

Entonces, en su caso, en lugar de tener una suposición imprecisa sobre qué directorio quiero, escribiría cd alTabcuál si solo hay una coincidencia, la completa y si hay 2 o más completa hasta donde termina la coincidencia y TabTabenumera las opciones.

Aquí hay un ejemplo de mi sistema:

cd Un Tab

cd Unknown

seguido por TabTabproduce

Unknown/                        Unknown Artist - Unknown Album/ 
Elder Geek
fuente
2

Esto parece un error en Bash: según man builtinsel comportamiento anterior es el correcto.

   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.

Puede informar el error en la bug-bashlista de correo; Más detalles aquí .


En realidad, el error fue reportado (hace mucho tiempo). Si desea un Bash fijo ahora, ahora, ahora , aquí le mostramos cómo hacerlo correctamente (probado en 17.10, también debería funcionar en otros).

Primero cree un directorio para trabajar, por ejemplo:

mkdir ~/bash
cd ~/bash

Obtenga el paquete fuente y las dependencias de compilación:

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

Editar config-top.hpara cambiar esto (debe ser la línea 32)

#define CD_COMPLAINS

a esto

/* #define CD_COMPLAINS */

Edite debian/changelogy agregue una entrada como esta en la parte superior (también puede usar el 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

Los puntos más importantes son agregar +fooal número de versión actual ( foopuede ser cualquier cadena de letras minúsculas; y tenga cuidado si usa dch -i, incrementará el último número, por lo que debe revertirlo al actual) y usar el nombre de lanzamiento correcto ( artfulaquí). Finalmente, corre dpkg-source --commit.

A continuación, puede ejecutar el debuildcomando y, si todo va bien ( debsignse pueden ignorar los errores ), debe tener algunos .debs en el directorio principal, que puede instalar como de costumbre (no es necesario instalarlos todos, solo los que tener ahora; usar dpkg -l | grep bashpara averiguarlo).

Tenga en cuenta que el número de versión del nuevo paquete está configurado para que obtenga automáticamente cualquier actualización futura de bash; Si la actualización no soluciona el problema, debe repetir el proceso anterior.

(Esta respuesta se publicó por primera vez en esta pregunta duplicada ).

fkraiem
fuente