Script Bash para cd para o diretório com espaços no nome do caminho


95

Estou usando o Bash no macOS X e gostaria de criar um arquivo de script executável simples que mudaria para outro diretório quando fosse executado. No entanto, o caminho para esse diretório contém espaços. Como diabos você faz isso? Isso é o que eu tenho ...

Nome do arquivo: cdcode

Conteúdo do arquivo:

cd ~/My Code

Agora, concedido, este não é um nome de caminho longo, mas meu nome de caminho real tem cinco diretórios e quatro desses diretórios têm espaços no caminho.

BTW, eu tentei cd "~/My Code"e cd "~/My\ Code"e nenhuma delas funcionou.


1
Estou tendo um problema semelhante ao descrito. Ou seja, nenhuma das maneiras possíveis de mudar para um diretório que contenha um espaço. Nada como: cd "Meu passaporte" cd Meu \ Passaporte cd Meu "Passaporte" nada está funcionando. A complição funciona bem. Posso listar: ls -l My \ Passport / funciona bem. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Seg 16 de julho 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, versão 3.1 .17 (1) -release- (i686-redhat-linux-gnu) alguma ideia, por favor?
Denis C

Respostas:


81

Quando você faz aspas duplas de um caminho, está interrompendo a expansão do til. Portanto, existem algumas maneiras de fazer isso:

cd ~/"My Code"
cd ~/'My Code'

O til não é citado aqui, então a expansão do til ainda será executada.

cd "$HOME/My Code"

Você pode expandir as variáveis ​​de ambiente dentro de strings com aspas duplas; isso é basicamente o que a expansão do til está fazendo

cd ~/My\ Code

Você também pode escapar de caracteres especiais (como espaço) com uma barra invertida.


3
Você poderia até mesmo cd ~ / Meu '' Código, mas seria idiota se você pudesse escapar dele com uma barra invertida
Nick Dixon

41

Encontrei a solução abaixo nesta página :

x="test\ me"  
eval cd $x

Uma combinação de \uma constante de texto entre aspas duplas e um evalbefore cdfaz com que funcione como um encanto!


mais clareza: Para cd'ing para o diretório de um arquivo de um script: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert

1
Isso realmente me ajudou a executar um script bash em uma máquina OS X. 🎉
timbillstrom

Realmente não há necessidade de evalaqui.
Benjamin W.

2
No OS X, não consegui fazer as outras / anteriores respostas funcionarem sem eval.
D. Woods de

10
cd ~/My\ Code

parece funcionar para mim ... Se ignorar as aspas, mas manter a barra não funcionar, você pode postar algum código de amostra?


10

Você pode usar qualquer um dos seguintes:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

Você não pode usar:

cd ~"/My Code"

O primeiro funciona porque o shell expande ~ / em $ HOME / e, em seguida, segue Meu Código sem as aspas duplas. A segunda falha porque não há um usuário chamado ' "' (aspas duplas) para ~"mapear.


9

Depois de lutar com o mesmo problema, tentei duas soluções diferentes que funcionam:

1. Use aspas duplas ( "") com suas variáveis.

A maneira mais fácil de fazer aspas duplas em suas variáveis, conforme apontado na resposta anterior:

cd "$yourPathWithBlankSpace"

2. Faça uso de eval.

De acordo com esta resposta, o comando Unix para escapar de espaços, você pode retirar o espaço em branco e usá-lo eval, assim:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

4

Uma única barra invertida funciona para mim:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

Tem certeza de que o problema não é que seu script de shell está mudando de diretório em seu subshell, mas você está de volta no shell principal (e no diretório original) quando terminar? Evitei isso usando. para executar o script no shell atual, embora a maioria das pessoas usaria apenas um alias para isso. Os espaços podem ser uma pista falsa.


Obrigado, Ry4an (e o resto dos entrevistados). Parece que estava executando o script incorretamente. Eu estava apenas tentando executá-lo assim:% ./cdsomedir Não percebi que precisava usar o "." para executar o script como você fez:%. cdsomedir.sh Depois de fazer isso, funcionou. Erro de novato. Obrigado!


2

Ao trabalhar no Linux, a sintaxe abaixo é correta:

cd ~/My\ Code

No entanto, ao executar seu arquivo, use a sintaxe abaixo:

$ . cdcode

(apenas '.' e não './')


Por curiosidade selvagem, por que isso importa? Eu só vi './' usado.
whaley

./ gerará um novo shell e, em seguida, mudará o diretório. Então, quando o script sai, ele volta para o shell que gerou o novo shell ... você estará no diretório onde executou o script em vez de ~ / My Code. '.' por outro lado, faz com que o script seja executado na instância atual do shell.
Alterlife

O ponto "." é um comando unix, um apelido para o comando "source". Deve ser seguido por um nome de arquivo. Portanto, "source myfile" executará o arquivo dentro do seu shell atual. E ". Myfile" fará o mesmo. A variável "./" significa "diretório atual" e não é um comando.
JPGConnolly

2

use aspas duplas

go () 
{ 
    cd "$*"
}

Obrigado. Uma adição útil às funções em um .bashrcarquivo para alterar o diretório ao colar nomes de diretório que contenham espaços na linha de comando sem ter que escapar dos espaços ou citar tudo. cdsé um nome melhor embora.
sábado

Existe alguma maneira de estender isso (sem um if) de forma que goseja equivalente a cd, ou seja, cd para o diretório inicial?
Zennehoy

2

A maneira muito simples de fazer isso é-

 $ cd My\ Folder

No bash, execute o comando DIR e nos resultados você verá que os nomes da pasta ou do caminho com espaço entre eles foram escritos nos resultados como este -

$dir
My\ Folder
New\ Folder

2

Isso vai resolver:

cd ~/My\ Code

Eu tive que usar isso para trabalhar com arquivos armazenados no iCloud Drive. Você não vai querer usar aspas duplas ("), pois o caminho deve ser absoluto. Em outras palavras, você não pode combinar aspas duplas com til (~).

A título de exemplo, tive que usar isso para um projeto recente:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

Espero que ajude.


1

Eu tive um problema semelhante agora, estava usando um script bash para despejar alguns dados. Acabei criando um link simbólico na pasta de script sem nenhum espaço nele. A seguir, apontei meu script para o link simbólico e funcionou bem.

Para criar seu link. ln -s [DIRETÓRIO OU ARQUIVO DE ALVO] ./[SHORTCUT]

Mau ou não pode ser útil.


0

Use aspas simples, como:

myPath=~/'my dir'

cd $myPath
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.