Ubuntu 17.04 - bash: cd: muitos argumentos

9

Acabei de atualizar meu Ubuntu 16.04 para 17.04 e encontrei um pequeno problema com o comando cd .

Digamos que eu tenha duas pastas: album-01 & amp; album-02

No Ubuntu 16.04, se eu fizer cd album* ele irá para a primeira pasta encontrada album-01

Mas no novo Ubuntu 17.04, se eu fizer cd album* , isso me resultará -bash: cd: too many arguments

Como fazer cd no Ubuntu 17.04 como cd no Ubuntu 16.04?

    
por Hidayats 17.04.2017 / 16:07

4 respostas

8

Eu ainda não pude testar isso em um sistema real 17.04 (apenas verifiquei que ele funciona em 16.04), mas você deve ser capaz de sobrescrever o comando interno cd Bash com sua própria função personalizada, que descarta qualquer argumentos adicionais, exceto o primeiro:

cd(){ command cd "" ; }

Atualização: Como sugerido em @o comentário do muru , esta versão abaixo pode funcionar melhor e suportar chamar cd sem argumentos:

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

Depois de ter inserido essa linha acima no seu terminal, verifique se cd agora se comporta da maneira desejada. Se esse for o caso, você pode tornar essa definição de função persistente anexando essa linha ao final do arquivo ~/.bashrc . Caso contrário, ele desaparecerá assim que você terminar a sessão atual do shell.

Observe que, se por algum motivo você precisar usar temporariamente o comando interno cd Bash real em vez desta função personalizada, você poderá simplesmente chamá-lo com command cd em vez de cd .

    
por Byte Commander 17.04.2017 / 16:48
7

Resposta curta / solução alternativa

Para responder à sua pergunta neste exato caso, isso funciona

cd album*1

Mas provavelmente não é a funcionalidade que você realmente deseja.

O que mudou?

Parece que config-top.h em Bash- 4.4 foi atualizado para adicionar a seguinte opção

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

#define CD_COMPLAINS

E builtins/cd.def se refere ao seu erro aqui :

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

O que posso fazer a longo prazo?

Você poderia compilar seu próprio bash sem o novo CD_COMPLAINS , mas isso seria entediante. Você pode redefinir a funcionalidade cd como sugerido aqui ou pode aliasar uma função como

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

Provando

Bash 4.4 Beta, onde ainda 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 Lançamento estável onde não 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
    
por Grayson Kent 17.04.2017 / 18:15
4

Eu nunca encontrei esse problema, pois sempre uso Conclusão Tab.

Então, no seu caso, em vez de adivinhar impreciso o diretório que eu quero, eu digitaria cd al Tab que, se houver apenas uma correspondência, a completa e se houver 2 ou mais completa até onde a correspondência termina e a aba Tab Tab lista as opções.

Veja um exemplo do meu sistema:

cd Un Separador

cd Unknown

seguido por Tab Tab produz

Unknown/                        Unknown Artist - Unknown Album/ 
    
por Elder Geek 18.04.2017 / 16:02
2

Isso parece um bug no Bash: por man builtins , o comportamento antigo é o correto.

   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.

Você pode relatar o erro na lista de discussão bug-bash ; mais detalhes aqui .

Na verdade, o bug foi relatado (há muito tempo). Se você quer um Bash fixo agora, agora, agora , aqui está como fazê-lo corretamente (testado em 17.10, deve funcionar em outros também).

Primeiro, crie um diretório para trabalhar, por exemplo:

mkdir ~/bash
cd ~/bash

Obtenha o pacote de origem e as dependências de construção:

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

Edite config-top.h para mudar isso (deve ser a linha 32)

#define CD_COMPLAINS

para isso

/* #define CD_COMPLAINS */

Edite debian/changelog e adicione uma entrada como esta no topo (você também pode usar o comando dch -i ):

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

  * Fix cd.

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

Os pontos mais importantes são acrescentar +foo ao número da versão atual ( foo pode ser qualquer sequência de letras minúsculas; e tenha cuidado se você usar dch -i , irá incrementar o último número, então você precisa revertê-lo para o atual) e usar o nome de lançamento correto ( artful aqui). Finalmente, execute dpkg-source --commit .

Você pode então executar o comando debuild , e se tudo correr bem (erros sobre debsign podem ser ignorados) você deve ter alguns .deb s no diretório pai, que você pode instalar como de costume (existe não é necessário instalar todos eles, apenas os que você tem agora; use dpkg -l | grep bash para descobrir).

Observe que o número da versão do novo pacote está definido para que você obtenha automaticamente qualquer atualização futura para bash ; Se a atualização não corrigir o problema, você terá que repetir o processo acima.

(Esta resposta foi publicada pela primeira vez em esta questão duplicada .)

    
por fkraiem 04.01.2018 / 13:55