web-dev-qa-db-fra.com

Variables basiques avec espaces

Je fais face au prochain problème dans MinGW Shell sous Windows. J'ai dans mon /etc/profile l'expression suivante:

export GIT_SSH="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"

Cela ne fonctionne pas lorsque j'utilise git fetch sur le référentiel local. Mais si je le fais comme (à l'ancienne façon), cela fonctionne:

export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe"

Ma question est:

Comment puis-je le faire fonctionner en utilisant des espaces dans la variable?

À des fins de test, vous pouvez simuler quelque chose comme ça (tout exemple est bon):

export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
# and try to execute like this
$VAR

Y a-t-il une solution à cela (autre que la précédente mentionnée)?

Tous les liens/conseils sont appréciés.

Merci,

Iulian

29
INS

Exécutez-le comme ceci: "$VAR". Il s'agit de l'un des pièges les plus importants dans les scripts Shell, car les chaînes sont toujours substituées littéralement et tous les espaces contenus sont traités comme des délimiteurs de jetons plutôt que comme des caractères de la chaîne. Pensez à remplacer une variable comme une sorte de code collé à l'exécution.

Que se passe-t-il vraiment lorsque vous écrivez $VAR est que le Shell essaie d'exécuter le binaire /c/Program avec un premier argument Files/TortoiseGit/bin/TortoisePlink.exe.

J'ai appris cela à la dure en obtenant une étrange erreur de syntaxe dans un gros script Shell pour une entrée particulière. Aucun autre langage auquel je peux penser ne peut se plaindre d'erreurs de syntaxe si l'entrée d'exécution contient des caractères spéciaux - mais c'est la nature des scripts Shell puisque les interprètes de commandes comme bash et sh interprètent le code ligne par ligne.

Chaque fois que vous vous attendez à ce qu'une chaîne contienne des espaces et que vous ne souhaitiez pas la traiter comme des jetons distincts, placez-la entre guillemets.

51

Pour référence, j'ai résolu un problème similaire sur osx en encapsulant l'argument avec des citations d'échappement. Ce n'est peut-être pas la meilleure solution, mais cela semble fonctionner.

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""
9
Alex

Je l'ai résolu en incluant une barre oblique inverse pour échapper à l'espace:

/Program Files devient /Program\ Files

Exemple:

export GIT_SSH=/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe

2
Eduard Dubilyer

Avec Git 2.23 (Q3 2019, huit ans plus tard), un GIT_SSH Réglé sur /c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe Fonctionnera ... (pour ceux qui sont encore sous Windows 7)!

Voir commit eb7c786 (16 juillet 2019) par Johannes Schindelin (dscho) .
(Fusionné par Junio ​​C Hamano - gitster - in commit a5194d8 , 25 juil.2019)

mingw: supporte les programmes d'apparition contenant des espaces dans leurs noms

Sur certaines anciennes versions de Windows (par exemple Windows 7), la fonction CreateProcessW() ne prend pas vraiment en charge les espaces dans son premier argument, lpApplicationName.
Mais il prend en charge le passage de NULL en lpApplicationName, ce qui permet de comprendre l'application à partir du premier argument (éventuellement cité) de lpCommandLine.

Utilisons cette astuce (si nous sommes certains que le premier argument correspond au chemin de l'exécutable) pour prendre en charge le lancement de programmes dont le chemin contient des espaces.

Cela corrige git-for-windows/git Problème 692

0
VonC