it-roy-ru.com

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

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

Имя файла: cdcode

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

cd ~/My Code

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

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

77
Rails Newbie

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

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

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

cd "$HOME/My Code"

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

cd ~/My\ Code

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

73
derobert

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

x="test\ me"  
eval cd $x

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

32
user365757

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

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

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

cd ~"/My Code"

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

8
Jonathan Leffler
cd ~/My\ Code

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

7
Andrew Flanagan

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

[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

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

4
Ry4an Brase

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

3
Chris F.A. Johnson

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

  • Решение 1. Самый простой способ - просто заключить переменные в кавычки, как указано в предыдущем ответе cd "$yourPathWithBlankSpace"
  • Решение 2: Согласно этому ответу команда Unix для экранирования пробелов вы можете убрать пробел, а затем использовать Eval, например так:

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

2
HanniBaL90

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

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder
2
Mayukh Datta

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

go () 
{ 
    cd "$*"
}
2
Bobo

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

cd ~/My\ Code

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

$ . cdcode

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

2
Alterlife

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

Чтобы создать вашу ссылку . Ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]

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

1
Alexis

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

myPath=~/'my dir'

cd $myPath
0
Jadian