Bash скрипт для cd в каталог с пробелами в pathname - PullRequest
80 голосов
/ 26 февраля 2009

Я использую Bash в macOS X, и я хотел бы создать простой исполняемый файл сценария, который при запуске переключится в другой каталог Однако путь к этому каталогу содержит пробелы. Как, черт возьми, ты делаешь это? Это то, что у меня есть ...

Имя файла: cdcode

Содержимое файла:

cd ~/My Code

Теперь предоставлено, это не длинное имя пути, но мой фактический путь имеет пять каталогов и в четырех из них есть пробелы.

Кстати, я пробовал cd "~/My Code" и cd "~/My\ Code", и ни один из них не работал.

Ответы [ 12 ]

75 голосов
/ 26 февраля 2009

Когда вы дважды заключаете в кавычки путь, вы останавливаете расширение тильды. Так что есть несколько способов сделать это:

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

Тильда здесь не указана, поэтому расширение тильды все равно будет запущено.

cd "$HOME/My Code"

Вы можете раскрыть переменные окружения внутри строк в двойных кавычках; это в основном то, что делает расширение тильды

cd ~/My\ Code

Вы также можете экранировать специальные символы (например, пробел) обратной косой чертой.

34 голосов
/ 13 июня 2010

Я нашел решение ниже на этой странице :

x="test\ me"  
eval cd $x

Сочетание \ в текстовой константе в двойных кавычках и eval перед cd заставляет его работать как шарм!

8 голосов
/ 26 февраля 2009

Вы можете использовать любой из:

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

Вы не можете использовать:

cd ~"/My Code"

Первый работает, потому что оболочка разворачивается ~ / в $ HOME /, а затем добавляет My Code без двойных кавычек. Второй сбой, потому что нет пользователя с именем '"' (двойная кавычка) для ~" для сопоставления.

8 голосов
/ 26 февраля 2009
cd ~/My\ Code

, кажется, работает для меня ... Если удаление кавычек, но сохранение слеша не работает, вы можете опубликовать пример кода?

4 голосов
/ 26 февраля 2009

У меня работает один обратный слеш:

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

Вы уверены, что проблема не в том, что ваш сценарий оболочки меняет каталог в своей подоболочке, но тогда вы вернетесь в основную оболочку (и исходный каталог), когда закончите? Я избежал этого, используя. запустить скрипт в текущей оболочке, хотя большинство людей просто использовали бы псевдоним для этого. Пространства могут быть красная сельдь.

3 голосов
/ 03 декабря 2017

После борьбы с той же проблемой, я попробовал два разных решения, которые работают:

1. Используйте двойные кавычки ("") со своими переменными.

Самый простой способ - просто заключить в кавычки переменные, как указано в предыдущем ответе:

cd "$yourPathWithBlankSpace"

2. Используйте eval.

Согласно этому ответу Команда Unix для экранирования пробелов вы можете убрать пробел, а затем использовать eval, например:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
3 голосов
/ 10 июня 2015

Избегайте ~ в скриптах; вместо этого используйте $ HOME.

2 голосов
/ 28 апреля 2017

Очень простой способ сделать это -

 $ cd My\ Folder

В bash запустите команду DIR, и в результате вы увидите, что имена папок или путей с пробелом между ними записаны в таких результатах:

$dir
My\ Folder
New\ Folder
2 голосов
/ 15 мая 2014

используйте двойные кавычки

go () 
{ 
    cd "$*"
}
2 голосов
/ 26 февраля 2009

При работе под Linux следующий синтаксис правильный:

cd ~/My\ Code

Однако, когда вы выполняете свой файл, используйте следующий синтаксис:

$ . cdcode

(только '.', А не './')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...