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

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

Имя файла: cdcode

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

cd ~/My Code

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

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


person Community    schedule 26.02.2009    source источник
comment
У меня проблема похожая на описанную. т.е. ни один из возможных способов перейти в каталог, в котором есть пробел. Ничего подобного: 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 16 Jul 08:49:50 EDT 2007 i686 i686 i386 GNU/Linux \›bash --help GNU bash, версия 3.1 .17(1)-release-(i686-redhat-linux-gnu) есть идеи?   -  person Denis C    schedule 22.01.2010


Ответы (13)


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

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

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

cd "$HOME/My Code"

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

cd ~/My\ Code

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

person derobert    schedule 26.02.2009
comment
Вы могли бы даже cd ~/My' 'Code, но это было бы глупо, если вместо этого вы можете экранировать его с помощью обратной косой черты - person Nick Dixon; 20.01.2010

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

x="test\ me"  
eval cd $x

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

person user365757    schedule 13.06.2010
comment
больше ясности: Для перехода к каталогу файла скрипта: DIR = $(dirname $0); eval компакт-диск $DIR - person Michael Scott Cuthbert; 04.11.2013
comment
Это действительно помогло мне запустить bash-скрипт на машине с OS X. ???? - person timbillstrom; 21.09.2018
comment
Здесь действительно нет необходимости в eval. - person Benjamin W.; 21.09.2018
comment
В OS X я не мог заставить другие/предыдущие ответы работать без eval. - person D. Woods; 21.01.2019

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

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

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

cd "$yourPathWithBlankSpace"

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

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

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
person HanniBaL90    schedule 03.12.2017

cd ~/My\ Code

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

person Andrew Flanagan    schedule 26.02.2009

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

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

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

cd ~"/My Code"

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

person Jonathan Leffler    schedule 26.02.2009

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

cd ~/My\ Code

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

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

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

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

person Josh    schedule 08.07.2020

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

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

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

person Ry4an Brase    schedule 26.02.2009
comment
Спасибо, Ry4an (и остальным ответившим). Кажется, я неправильно выполнял скрипт. Я просто пытался запустить его так: % ./cdsomedir Я не понимал, что мне нужно использовать файл . чтобы запустить скрипт, как вы это сделали: % . cdsomedir.sh Как только я это сделал, это сработало. Ошибка новичка. Спасибо! - person ; 01.03.2009

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

person Chris F.A. Johnson    schedule 10.06.2015

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

cd ~/My\ Code

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

$ . cdcode

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

person Alterlife    schedule 26.02.2009
comment
Из дикого любопытства, зачем это? Я только когда-либо видел использование './'. - person whaley; 13.05.2010
comment
./ создаст новую оболочку, а затем изменит каталог. Поэтому, когда сценарий завершается, он возвращается к оболочке, которая породила новую оболочку... вы окажетесь в каталоге, где вы выполнили сценарий, а не в ~/My Code. '.' с другой стороны, вызывает выполнение сценария в текущем экземпляре оболочки. - person Alterlife; 17.05.2010
comment
Точка . это команда unix, псевдоним исходной команды. За ним должно следовать имя файла. Таким образом, исходный файл myfile запустит файл в вашей текущей оболочке. А также . myfile сделает то же самое. Переменная ./ означает текущий каталог и не является командой. - person JPGConnolly; 20.05.2015

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

go () 
{ 
    cd "$*"
}
person Bobo    schedule 15.05.2014
comment
Спасибо. Полезное дополнение к функциям в файле .bashrc для изменения каталога при вставке имен каталогов, содержащих пробелы, в командную строку без необходимости затем экранировать пробелы или заключать все это в кавычки. Хотя cds имя лучше. - person mattst; 25.11.2016
comment
Есть ли способ расширить это (без if), чтобы только go было эквивалентно cd, то есть cd в домашний каталог? - person zennehoy; 03.08.2017

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

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder
person Mayukh Datta    schedule 28.04.2017

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

myPath=~/'my dir'

cd $myPath
person Jadian    schedule 24.05.2018

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

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

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

person Community    schedule 13.05.2010