Сценарий Bash для перехода в каталог с пробелами в имени пути

96

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

Имя файла: cdcode

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

cd ~/My Code

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

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

Бенджамин В.
источник
1
У меня проблема, аналогичная описанной. Т.е. ни один из возможных способов перейти в каталог, в котором есть место. Ничего подобного: cd "My Passport" cd My \ Passport cd My "Passport" ничего не работает. Композиция работает нормально. Могу перечислить: ls -l My \ Passport / отлично работает. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Mon Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, версия 3.1 .17 (1) -release- (i686-redhat-linux-gnu) какие-нибудь идеи, пожалуйста?
Denis C

Ответы:

81

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

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

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

cd "$HOME/My Code"

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

cd ~/My\ Code

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

Derobert
источник
3
Вы даже можете cd ~ / My '' Code, но это было бы глупо, если бы вы могли экранировать его с помощью обратной косой черты
Ник Диксон
42

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

x="test\ me"  
eval cd $x

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

user365757
источник
для большей ясности: Для перехода к каталогу файла скрипта: DIR = $ (dirname "$ 0"); eval cd $ DIR
Майкл Скотт Катберт
1
Это действительно помогло мне запустить bash-скрипт на машине OS X. 🎉
timbillstrom
В этом действительно нет необходимости eval.
Бенджамин В.
2
В OS X я не мог заставить другие / предыдущие ответы работать без eval.
Д. Вудс
11

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

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

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

cd "$yourPathWithBlankSpace"

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

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

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
HanniBaL90
источник
10
cd ~/My\ Code

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

Эндрю Фланаган
источник
10

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

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

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

cd ~"/My Code"

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

Джонатан Леффлер
источник
4

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

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

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

Ry4an Brase
источник
Спасибо, Ry4an (и остальные респонденты). Похоже, я неправильно выполнял скрипт. Я просто пытался запустить его так:% ./cdsomedir Я не понимал, что мне нужно использовать "." чтобы запустить сценарий, как вы:%. cdsomedir.sh Как только я это сделал, все заработало. Ошибка новичка. Благодарность!
3

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

Крис Ф.А. Джонсон
источник
2

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

cd ~/My\ Code

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

$ . cdcode

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

Альтерлайф
источник
Почему это важно из-за дикого любопытства? Я когда-либо видел только использование './'.
Whaley
./ создаст новую оболочку, а затем сменит каталог. Поэтому, когда сценарий завершается, он возвращается к оболочке, которая породила новую оболочку ... вы будете в каталоге, в котором вы выполнили сценарий, вместо ~ / My Code. '.' с другой стороны, вызывает выполнение сценария в текущем экземпляре оболочки.
Alterlife
Точка "." это команда unix, псевдоним для команды "source". За ним должно следовать имя файла. Таким образом, "исходный myfile" запустит файл в вашей текущей оболочке. И ". Myfile" будет делать то же самое. Переменная «./» означает «текущий каталог» и не является командой.
JPGConnolly
2

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

go () 
{ 
    cd "$*"
}
Бобо
источник
Спасибо. Полезное дополнение к функциям в .bashrcфайле для смены каталога при вставке имен каталогов, содержащих пробелы, в командную строку без необходимости затем экранировать пробелы или заключать все в кавычки. cdsхотя имя лучше.
mattst
Есть ли способ расширить это (без if) так, чтобы goон был эквивалентен cd, например, cd в домашний каталог?
zennehoy 03
2

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

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder
Маюх Датта
источник
2

Это сделает это:

cd ~/My\ Code

Мне пришлось использовать это для работы с файлами, хранящимися на iCloud Drive. Вы не захотите использовать двойные кавычки ("), так как тогда это должен быть абсолютный путь. Другими словами, вы не можете комбинировать двойные кавычки с тильдой (~).

В качестве примера мне пришлось использовать это для недавнего проекта:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

Надеюсь, это поможет.

Джош
источник
1

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

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

Мау или может не пригодиться.


источник
1

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

myPath=~/'my dir'

cd $myPath
Джадиан
источник