2009-02-26 4 views
71

Argggg. Я борется с этой глупой проблемой в течение нескольких дней, и я не могу найти ответ.BASH Script to cd to directory с пробелами в пути

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

Имя файла: cdcode

содержимое файла: cd ~/My Code

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

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

+1

У меня проблема, аналогичная описанной. I.e. ни один из возможных способов изменить каталог, в котором есть пробел. не Ничего подобного: CD "My Passport" кд My \ Passport CD мой "Паспорт" ничего не работает. Сложность работает нормально. Я могу перечислить: ls -l My \ Passport/ работает нормально. \> uname -a Linux хост 2.6.18-8.1.8.el5.centos.плюс # 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) любые идеи, пожалуйста? –

ответ

6
cd ~/My\ Code 

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

4

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

[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 

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

+0

Спасибо, Ry4an (и остальные респонденты). Кажется, что я неправильно выполнял скрипт. Я просто пытался запустить его так: % ./cdsomedir Я не понимал, что мне нужно использовать «.». для запуска скрипта, как и вы: %. cdsomedir.sh Как только я это сделал, он сработал. Ошибка новичка. Благодаря! – 2009-03-01 01:00:53

2

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

cd ~/My\ Code

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

$ . cdcode

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

+0

Из-за дикого любопытства, почему это имеет значение? Я только когда-либо видел «./». – whaley

+0

./ появится новая оболочка, а затем изменится каталог. Поэтому, когда скрипт завершается, он возвращается к оболочке, которая породила новую оболочку ... вы попадете в каталог, где вы выполнили скрипт вместо ~/My Code. '.' с другой стороны, вызывает выполнение сценария в текущем экземпляре оболочки. – Alterlife

+0

Точка "." является командой unix, псевдоним для команды «source». За ним следует имя файла. Итак, «source myfile» запустит файл в вашей текущей оболочке. И «myfile» сделает то же самое. Переменная «./» означает «текущий каталог» и не является командой. – JPGConnolly

7

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

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

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

cd ~"/My Code" 

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

67

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

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

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

cd "$HOME/My Code" 

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

cd ~/My\ Code 

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

+2

Вы могли бы даже cd ~/My '' Code, но это было бы глупо, когда вы могли бы избежать этого с помощью обратного слэша вместо –

1

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

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

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

27

Эй! Я видел это в http://www.askdavetaylor.com/can_my_path_include_directory_names_with_spaces.html

х = «тест \ я»
Eval кд $ х

Комбинация \ в двойных кавычках константы текста и «Eval» до «компакт-диск» делает его работу как Шарм!

+1

Отличная идея. Благодарю. –

+0

больше четкости: для cd'ing в каталог файла сценария: DIR = $ (dirname "$ 0"); eval cd $ DIR –

1

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

go() 
{ 
    cd "$*" 
} 
+0

Спасибо. Полезное дополнение к функциям в файле '.bashrc' для изменения каталога при вставке имен каталогов, содержащих пробелы, в командную строку, без необходимости убирать пробелы или процитировать все это. Однако 'cds' - лучшее имя. – mattst

+0

Есть ли способ расширить это (без if), чтобы просто 'go' будет эквивалентен' cd', то есть cd в домашний каталог? – zennehoy

1

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

1

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

это-
$ cd My\ Folder 

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

$dir 
My\ Folder 
New\ Folder 
1

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

  • Solution1: Самый простой способ просто двойные кавычки переменные как было указано в предыдущем ответе cd "$yourPathWithBlankSpace"
  • Solution2: В соответствии с этим ответом Unix command to escape spaces вы можете раздеться пробел затем сделать использование Eval, как это:

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

Смежные вопросы