Navegar para o diretório com espaços não é mais possível

2

Eu sou realmente novo para bash como sempre desenvolvido em uma máquina windows (sim, eu sei). Até recentemente, eu consegui gravar em um diretório usando

cd a\ dir\ name\ with\ spaces/

mas de repente isso não funciona mais. Mesmo usando o preenchimento automático de TAB, ele gerará as fugas adequadas, mas sempre me encontro com algo como

-bash: cd: a: No such file or directory

um amigo mencionou que pode estar relacionado ao caminho. Alguém pode lançar alguma luz sobre este assunto para mim?

Abaixo está minha .bash_profile

# Exe subshell script
source ~/.bashrc

E o .bashrc

function cs ()
{
  cd $1
  ls
}

# A new version of "cd" which
# prints the directory after cd'ing
cd() {
        builtin cd $1
        pwd
}
    
por Dori 15.03.2012 / 14:11

1 resposta

5

Um substituto correto seria:

cd() {
    builtin cd "$1"
    pwd
}

Você precisa citar uma variável que contenha espaços quando for expandida, se quiser mantê-los.

Por que preciso fazer isso?

Vamos examinar:

  • Digamos que você chame sua função cd personalizada com o argumento with\ spaces .
  • Obviamente, você precisa fazer isso, pois, caso contrário, sua função receberia dois argumentos, ou seja, with e spaces .
  • Então, corretamente, a sua função recebe o argumento with spaces como um .
  • Você passa esse argumento para builtin cd usando $1 .
  • $1 é expandido automaticamente para with spaces (desde que a função foi recebida).
  • Sua chamada agora é builtin cd with spaces/
  • Isso resulta novamente em uma chamada para cd com os dois argumentos with e spaces .

Então, para corrigir isso:

  • Cite $1 com aspas duplas .
  • O comando é expandido para builtin cd "with spaces" .
  • Agora, cd é chamado corretamente com o argumento um novamente.

Outra possibilidade é usar apenas um parâmetro mais genérico "$@" em vez de "$1" para passar todos parâmetros e não apenas o primeiro para outro script. Isso é o que você quer fazer em 99% dos casos.

cd() {
    builtin cd "$@"
    pwd
}

Obviamente, a mesma correção se aplica à sua função cs() .

    
por 15.03.2012 / 14:47

Tags