Bash скрипт для cd в каталог с пробелами в pathname

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

Имя файла: cdcode

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

cd ~/My Code

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

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

Ответ 1

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

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

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

cd "$HOME/My Code"

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

cd ~/My\ Code

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

Ответ 2

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

x="test\ me"  
eval cd $x

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

Ответ 3

cd ~/My\ Code

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

Ответ 4

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

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

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

cd ~"/My Code"

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

Ответ 5

Для меня работает одна обратная косая черта:

[email protected]:~$ mkdir "My Code"

[email protected]:~$ vi todir.sh

[email protected]:~$ . todir.sh 

[email protected]:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

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

Ответ 6

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

Ответ 7

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

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

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

cd "$yourPathWithBlankSpace"

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

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

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

Ответ 8

При работе под Linux синтаксис ниже прав:

cd ~/My\ Code

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

$ . cdcode

(просто '.', а не './')

Ответ 9

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

go () 
{ 
    cd "$*"
}

Ответ 10

Самый простой способ сделать это -

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder

Ответ 11

У меня была аналогичная проблема, когда я использовал bash script, чтобы сбрасывать некоторые данные. Я закончил создание символической ссылки в папке script без каких-либо пробелов в ней. Затем я указал на script на символическую ссылку и прекрасно работает.

Чтобы создать свою ссылку. ln -s [ЦИФРОВОЙ КАТАЛОГ ИЛИ ФАЙЛ]./[SHORTCUT]

Мау или не может быть полезным.

Ответ 12

Используйте одинарные кавычки, например:

myPath=~/'my dir'

cd $myPath