Est-il possible d'avoir des espaces d'échappement bash dans pwd?

21

Je voudrais copier le répertoire courant dans le presse - papiers, quelque chose comme: pwd | pbcopy. Cependant, pwdn'échappe pas à l'espace, donc quelque chose dans "Application Support", par exemple, ne se copie pas correctement. Je ne me souviens pas que cela ait toujours été le cas, donc j'aurais pu tromper quelque chose. Utilisation d'iTerm2.

Y a-t-il un réglage bash pour tout échapper? des problèmes de recherche, trop de questions / sujets sur Spaces.app ou esc.

Courant:

$ pwd
/Library/Application Support/Google Earth/

Préféré:

$ pwd
/Library/Application\ Support/Google\ Earth/

Articles déjà vus: Copier le chemin du répertoire actuel dans le presse-papiers et comment cd dans un répertoire avec un nom contenant des espaces dans bash? , qui n'abordent pas cette question. J'aurais fait un commentaire dans le premier, mais je n'ai pas les privilèges.

greenwar
la source
1
Je doute que la copie soit correcte - ce que vous voulez, c'est la pâte pour gérer les espaces - dans quelle application collez-vous?
user151019
Grande question. Vous aurez bientôt assez de représentants pour commenter. Bienvenue sur le site!
bmike
1
pwd | pbcopyfonctionne bien pour moi dans le terminal. Finder / Edit / Show Clipboard confirme que tout va bien.
lhf
@lhf Oui, aurait dû vérifier dans Terminal, qui fonctionne comme vous l'avez indiqué. Pas de chance dans iTerm2, cependant. Je devrais peut-être revenir en arrière ...
greenwar
Comment cela peut-il dépendre de l'émulateur de terminal que vous utilisez? Je viens de tester et pwd | pbcopyfonctionne bien dans iTerm2.
lhf

Réponses:

13

Cette commande échappera correctement aux espaces:

printf "%q\n" "$(pwd)" | pbcopy

Vous pouvez l'aliaser en utilisant quelque chose avec l'histoire comme cwdsi cela ne vous dérange pas de redéfinir un cwd différent

alias cwd='printf "%q\n" "$(pwd)" | pbcopy'

Abandonnez le tuyau à pbcopy si vous voulez qu'il fonctionne plus comme pwd et imprimez simplement le chemin d'échappement.

glenn jackman
la source
ne fonctionne pas sur mac
Macilias
1
Fonctionne sur mon Mac.
Jason Swett
5
pwd | sed 's/ /\\ /g'

Mais je ne suis pas sûr que cela résoudra finalement votre problème. pbcopy copie exactement ce qu'il reçoit sur stdin.

marque
la source
Cela n'échappera qu'aux espaces, ce qui n'est pas suffisant, même si c'est ce que l'OP a utilisé comme exemple.
Old Pro
mais cela fonctionne dans la plupart des cas, le bon de glenn n'a pas fonctionné sur mon mac, il n'y a aucune sortie
Macilias
Vous pouvez également l'utiliser comme alias lorsque vous déclarez une fonction: function escapePWD () {pwd | sed 's / / \\ / g'; } et utilisez ceci pour l'alias: alias epwd = 'escapePWD'
Macilias
1

Il n'y a aucun moyen intégré de créer pwddes chemins de fichier d'échappement en sortie, car cela n'est généralement pas utile.

Il n'est pas logique d' ajouter pwdou pbcopyd'ajouter des barres obliques inverses à ce qui est copié. Si vous vouliez copier le chemin d'accès dans un fichier texte ou une publication Web, vous ne voudriez pas qu'une barre oblique inverse y soit insérée.

Ce que vous voulez probablement faire, c'est créer un alias séparé, comme qwdpour imprimer la forme entre guillemets du répertoire courant, ou simplement échapper la sortie de pbpaste, ce qui est aussi simple que de le mettre entre guillemets:

bash-3.2$ pwd
/Users/user
bash-3.2$ cd test\ dir/untitled\ \"folder/
bash-3.2$ pwd
/Users/user/test dir/untitled "folder
bash-3.2$ pwd | pbcopy
bash-3.2$ echo "`pbpaste`"
/Users/user/test dir/untitled "folder
bash-3.2$ cd
bash-3.2$ pwd
/Users/user
bash-3.2$ cd `pbpaste`
bash: cd: /Users/user/test: No such file or directory
bash-3.2$ cd "`pbpaste`"
bash-3.2$ pwd
/Users/user/test dir/untitled "folder

Notez que ce ne sont pas seulement les espaces qui doivent être échappés. Les barres obliques avant et arrière, l'étoile, le point d'interrogation, l'esperluette, le point-virgule et d'autres caractères doivent également s'échapper. Le plus sûr est simplement d'utiliser des guillemets doubles comme dans l'exemple, qui fonctionnera même si le chemin contient des guillemets doubles.

Si vous voulez être pervers à ce sujet, vous pouvez demander à AppleScript de citer le répertoire actuel pour vous:

bash-3.2$ alias qwd="osascript -e 'return quoted form of POSIX path of (POSIX file \"./\" as alias)'"
bash-3.2$ qwd
'/Users/user/test dir/untitled "folder'

Sinon, je suis principalement d'accord avec Glenn, sauf que, comme ci-dessus, je voudrais alias le formulaire cité pour qwdne pas interférer avec la normale pwd:

alias qwd='printf "%q\n" "$(pwd)"'
Old Pro
la source