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.

Benjamin W.
fonte
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.

Derobert
fonte
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!

user365757
fonte
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?

Andrew Flanagan
fonte
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.

Jonathan Leffler
fonte
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
HanniBaL90
fonte
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.

Ry4an Brase
fonte
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!
3

Evite ~ em scripts; use $ HOME em vez disso.

Chris FA Johnson
fonte
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 './')

Alterlife
fonte
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 "$*"
}
Bobo
fonte
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
Mayukh Datta
fonte
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.

Josh
fonte
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.


fonte
0

Use aspas simples, como:

myPath=~/'my dir'

cd $myPath
Jadian
fonte