web-dev-qa-db-fra.com

Script Bash sur cd dans un répertoire avec des espaces dans le nom du chemin

J'utilise Bash sur macOS X et j'aimerais créer un simple fichier de script exécutable qui serait remplacé par un autre répertoire lors de son exécution. Cependant, le chemin d'accès à ce répertoire contient des espaces. Comment diable faites-vous cela? C'est ce que j'ai ...

Nom du fichier: cdcode

Contenu du fichier:

cd ~/My Code

Cela dit, ce n’est pas un long chemin, mais mon chemin actuel a une profondeur de cinq répertoires et quatre de ces répertoires ont des espaces dans le chemin.

BTW, j'ai essayé cd "~/My Code" et cd "~/My\ Code" et aucun de ceux-ci n'a fonctionné.

77
Rails Newbie

Lorsque vous double-citez un chemin, vous arrêtez le développement du tilde. Donc, il y a plusieurs façons de le faire:

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

Le tilde n'est pas cité ici, donc l'expansion du tilde sera toujours exécutée.

cd "$HOME/My Code"

Vous pouvez développer les variables d'environnement dans des chaînes entre guillemets; c'est essentiellement ce que l'expansion tilde fait

cd ~/My\ Code

Vous pouvez également échapper des caractères spéciaux (tels que l'espace) avec une barre oblique inverse.

73
derobert

J'ai trouvé la solution ci-dessous sur cette page

x="test\ me"  
eval cd $x

Une combinaison de \ dans une constante de texte à double guillemet et d'une eval avant cd le fait fonctionner comme un charme

32
user365757

Vous pouvez utiliser l'un des:

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

Vous ne pouvez pas utiliser:

cd ~"/My Code"

La première fonctionne parce que le shell développe ~/dans $ HOME /, puis pointe sur Mon code sans les guillemets. La seconde échoue car il n'y a pas d'utilisateur appelé """ (guillemet double) à utiliser pour ~".

8
Jonathan Leffler
cd ~/My\ Code

semble fonctionner pour moi ... Si laisser tomber les guillemets mais garder la barre oblique ne fonctionne pas, pouvez-vous poster un exemple de code?

7
Andrew Flanagan

Une simple barre oblique inverse fonctionne pour moi:

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

Êtes-vous sûr que le problème ne réside pas dans le fait que votre script Shell change de répertoire dans son sous-shell, mais vous revenez dans le shell principal (et dans le répertoire d'origine) une fois terminé? J'ai évité cela en utilisant. pour exécuter le script dans le shell actuel, bien que la plupart des gens utilisent simplement un alias pour cela. Les espaces pourraient être un hareng rouge.

4
Ry4an Brase

Évitez ~ dans les scripts; utilisez plutôt $ HOME à la place.

3
Chris F.A. Johnson

Après avoir lutté avec le même problème, j'ai essayé deux solutions différentes qui fonctionnent:

  • Solution1: Le moyen le plus simple consiste simplement à mettre entre guillemets vos variables, comme indiqué dans la réponse précédente cd "$yourPathWithBlankSpace"
  • Solution2: Selon cette réponse commande Unix pour échapper aux espaces vous pouvez supprimer les espaces vides puis utiliser Eval, comme ceci:

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

2
HanniBaL90

Le moyen très simple de faire cela est- 

 $ cd My\ Folder

Dans bash, exécutez la commande DIR et dans les résultats, vous verrez que les noms de dossiers ou de chemins comportant un espace entre eux ont été écrits dans les résultats, comme suit: 

$dir
My\ Folder
New\ Folder
2
Mayukh Datta

utilisez des guillemets doubles 

go () 
{ 
    cd "$*"
}
2
Bobo

Lorsque vous travaillez sous Linux, la syntaxe ci-dessous est la bonne:

cd ~/My\ Code

Cependant, lorsque vous exécutez votre fichier, utilisez la syntaxe ci-dessous:

$ . cdcode

(juste '.' et non './')

2
Alterlife

J'avais un problème similaire maintenant si j'utilisais un script bash pour dumper des données. J'ai fini par créer un lien symbolique dans le dossier de script, sans espaces. J'ai ensuite pointé mon script sur le lien symbolique et cela fonctionne bien.

Pour créer votre lien . Ln -s [FICHIER ANNUAIRE CIBLE OR] ./[SHORTCUT]

Mau ou peut ne pas être utile.

1
Alexis

Utilisez des guillemets simples, comme:

myPath=~/'my dir'

cd $myPath
0
Jadian