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é.
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.
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
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 ~"
.
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?
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.
Évitez ~ dans les scripts; utilisez plutôt $ HOME à la place.
Après avoir lutté avec le même problème, j'ai essayé deux solutions différentes qui fonctionnent:
cd "$yourPathWithBlankSpace"
yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
+ eval cd $yourPathEscaped
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
utilisez des guillemets doubles
go ()
{
cd "$*"
}
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 './')
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.
Utilisez des guillemets simples, comme:
myPath=~/'my dir'
cd $myPath