Ubuntu 17.04 - bash: cd: muitos argumentos

10

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

Digamos que eu tenho duas pastas: album-01&album-02

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

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

Como fazer cdno Ubuntu 17.04 como cdno Ubuntu 16.04?

Hidayats
fonte
4
O que você recebe faz sentido, pois você cdindica dois locais e, de alguma forma, espera que ele descubra qual deles você deseja.
precisa
1
@mikewhatever Infelizmente, os manuais Bash não concorda com você: "Todos os argumentos adicionais seguintes diretório são ignorados"
Muru
3
Postado um relatório de erro, no caso de qualquer pessoa interessada: bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
Muru
Não se esqueça de aceitar a resposta que mais o ajudou, clicando no botão cinza de verificação à esquerda, se sua pergunta foi resolvida satisfatoriamente.
Byte Commander

Respostas:

9

Ainda não pude testar isso em um sistema 17.04 real (apenas verifiquei que ele funciona em 16.04), mas você poderá substituir o cdcomando interno do Bash por sua própria função personalizada, que descarta quaisquer argumentos adicionais, exceto o primeiro. :

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

Atualização: Conforme sugerido no comentário de @ muru , esta versão abaixo pode funcionar melhor e suportar chamadas cdsem argumentos:

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

Depois de inserir esta linha acima em seu terminal, verifique se cdagora se comporta da maneira que deseja. Se for esse o caso, você pode tornar essa definição de função persistente anexando essa linha ao final do seu ~/.bashrcarquivo. Caso contrário, ele desaparecerá assim que você encerrar sua sessão atual do shell.

Observe que, por qualquer motivo, você precise temporariamente usar o cdcomando interno do Bash real em vez desta função personalizada, você pode simplesmente chamá-lo com, em command cdvez de sem formatação cd.

Byte Commander
fonte
Eu estava escrevendo a mesma coisa, em vez de função que eu estava sugerindo um alias para minúscula script ... se ele funciona;)
Ravexina
@Ravexina Também considerei usar um alias primeiro, mas depois o soltei porque acho que não pode ser feito com um alias, porque lá você não tem controle aberto dos argumentos. Por curiosidade, que abordagem você sugeriria?
Byte Commander
Fiz a mesma coisa, apenas coloquei o código em um .sharquivo e criei um pseudônimo como:mcd="source /home/user/bin/cd.sh"
Ravexina 17/17/17
Ah ok. Isso é um pouco mais complicado do que seria necessário, mas deve funcionar também.
Byte Commander
2
@SandiHidayat Tente em cd () { builtin cd "${@:1:1}"; }vez disso.
Muni
7

Resposta curta / Solução alternativa

Para responder sua pergunta neste caso exato, isso funciona

cd album*1

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

O que mudou?

Parece que config-top.hno 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.defrefere-se 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 o seu próprio bashsem o novo CD_COMPLAINS , mas isso seria tedioso. Você pode redefinir a cdfuncionalidade como sugerido aqui ou também pode usar uma função como

cd "$(find $1* | 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

Versão estável do Bash 4.4, 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
Grayson Kent
fonte
Desculpe, foi um erro de digitação. Resposta atualizada.
Grayson Kent
Ah, certo. Você poderia fazer isso cd alb*1, para combinar com o literal 1no final, mesmo sem os colchetes. Confundi sua ideia com outra coisa a princípio.
Ilkkachu
5

Eu nunca encontrei esse problema, pois sempre uso a Conclusão de tabulação.

Portanto, no seu caso, em vez de ter um palpite impreciso sobre qual diretório eu quero, digitaria cd alTabqual, se houver apenas uma correspondência, a completa e se houver duas ou mais, até onde termina a correspondência e TabTablista as opções.

Aqui está um exemplo do meu sistema:

cd Un Tab

cd Unknown

seguido por TabTabproduz

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

Isso parece um bug no Bash: man builtinspelo 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 bug-bashlista de discussão; mais detalhes aqui .


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

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

mkdir ~/bash
cd ~/bash

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

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

Edite config-top.hpara alterar isso (deve ser a linha 32)

#define CD_COMPLAINS

para isso

/* #define CD_COMPLAINS */

Edite debian/changeloge adicione uma entrada como esta na parte superior (você também pode usar o 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

Os pontos mais importantes são anexar +fooao número da versão atual ( foopode ser qualquer sequência de letras minúsculas; e, se você usar dch -i, ele aumentará o último número, portanto, será necessário revertê-lo para o atual) e usar o nome de versão correto ( artfulaqui). Finalmente, corra dpkg-source --commit.

Em seguida, você pode executar o debuildcomando e, se tudo der certo (os erros debsignpodem ser ignorados), você deverá ter alguns .debs no diretório pai, que pode ser instalado normalmente (não há necessidade de instalar todos eles, apenas os que você tenha agora; use dpkg -l | grep bashpara descobrir).

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

(Esta resposta foi postada pela primeira vez nesta pergunta duplicada .)

Fkraiem
fonte