2013-08-19 4 views
26

Я пробовал много чего. Смотрите ниже:
Как записать в каталог с пробелом в названии?

Попытка попасть в каталог: /cygdrive/с/Пользователи/мои ДМО/Документы

$ DOCS="/cygdrive/c/Users/my\ dir/Documents" 

$ echo $DOCS 
/cygdrive/c/Users/my\ dir/Documents 

$ cd $DOCS 
-bash: cd: /cygdrive/c/Users/my\: No such file or directory 

$ cd /cygdrive/c/Users/my\ dir/Documents 
(success) 

Очень странное поведение. Когда я вручную ввожу его, backspace выполняет свою функцию escape-символа. Но не тогда, когда я использую расширение параметра с переменной DOCS.
Я пробовал другие варианты, такие как обратная косая черта.

$ DOCS=/cygdrive/c/Users/Rahman\ dir/Documents 

$ echo $DOCS 
/cygdrive/c/Users/my dir/Documents 

$ cd $DOCS 
-bash: cd: /cygdrive/c/Users/my: No such file or directory 

или

$ DOCS="/cygdrive/c/Users/my dir/Documents" 

$ echo $DOCS 
/cygdrive/c/Users/my dir/Documents 

$ cd $DOCS 
-bash: cd: /cygdrive/c/Users/my: No such file or directory 

Я знаю, что это возможно. См. Здесь:

$ echo $HOME 
/home/my dir 

[EDIT] Как указано, cd $ HOME также не работает. котировки должны быть размещены вокруг него.

Какого черта:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\"" 

$ echo $DOCS 
"/cygdrive/c/Users/my dir/Documents" 

$ cd $DOCS 
-bash: cd: "/cygdrive/c/Users/my: No such file or directory 
+2

Не избежать пространства, но добавьте кавычки: 'DOCS = "/ cygdrive/c/Users/my dir/Documents" ' – Floris

+0

Нет разницы. Я отредактировал выше, поэтому в пространстве нет выхода. – user2316667

+0

Никакой реальной разницы, если я уйду из пространства, используя обратную косую черту или кавычки, но я все равно повторил. См. Ревизию. – user2316667

ответ

31
$ cd "$DOCS" 

Вы должны процитировать "$DOCS", чтобы предотвратить пробела из разбираемых в качестве разделителя слов. Чаще всего не следует указывать ссылки на переменные.

Обратите внимание, что $HOME будет иметь ту же проблему. Проблема возникает, когда оболочка оценивает ссылки на переменные; это не имеет никакого отношения к тем, какие переменные вы используете или как вы их назначаете. Это расширение, которое нужно указывать.

$ echo $HOME 
/home/my dir 

Это обманчиво. echo на самом деле эхо двух строк /home/my и dir. Если вы используете cd или ls, вы увидите, как он работает.

$ ls $HOME 
ls: cannot access /home/my: No such file or directory 
ls: cannot access dir: No such file or directory 
$ cd $HOME 
bash: cd: /home/my: No such file or directory 
$ cd "$HOME" 
<success!> 

Могу ли я спросить, почему это работает, когда я вручную ввести его, но не в переменной?

Отличный вопрос! Давайте рассмотрим команды, которые вы набрали:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\"" 
$ echo $DOCS 
"/cygdrive/c/Users/my dir/Documents" 
$ cd $DOCS 
-bash: cd: "/cygdrive/c/Users/my: No such file or directory 

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

$ cd $DOCS 

Из-за этого, cd передается два параметра. Насколько cd знает, что это выглядит, как Вы писали:

$ cd '"/cygdrive/c/Users/my' 'dir/Documents"' 

Два параметра, двойные кавычки нетронутыми.

+0

Я не хочу использовать кавычки каждый раз. Вот почему я изначально вставил обратную косую черту. – user2316667

+0

@ user2316667 Извините. Вы должны. –

+0

Ну ... как это делает $ HOME? – user2316667

-1

Вместо:
DOCS = "/ cygdrive/с/Пользователи/мои \ реж/Документы" попробовать:
DOCS = "/ cygdrive/с/Пользователи/мой каталог/Документы " Это должно работать на любую систему POSIX.

+0

Мне нужно бросить, я использую Cygwin. Не стоит ничего менять, но я пробовал это и не работал. – user2316667

+0

Что показывает ls/cygdrive/c/Users? Независимо от того, какой Cygwin видит каталог, который должен использоваться как переменная BASH.
Cygwin часто бывает менее совершенным в отношении перевода файлов в формате windows-unicey. Если вы не портируете программное обеспечение и не требуете соответствия POSIX, есть MinGW/MSYS, который на 10-100% быстрее, чем Cygwin, и гораздо меньше подвержен ошибкам: http://mingw.org/wiki/msys – user2697927

+0

Показывает все правильно, включая мой каталог – user2316667

0

попробовать

DOCS="/cygdrive/c/Users/my\ dir/Documents"; 

cd "$DOCS" 
+0

Вы * попробовали? Это помещает фактический символ обратной косой черты в '' $ DOCS''. –

1

Почему бы не поставить его в вашем .cshrc (или .bashrc, или независимо от вашего умолчанию оболочка):

alias mydoc 'cd "/cygdrive/c/Users/my dir/Documents"' 

Первый раз, когда вы сделаете это, вы должны сделать

source .cshrc 

, чтобы обновить оболочку с помощью этого нового псевдонима, тогда вы можете ввести

mydoc 

в любое время, когда вы хотите cd в свой каталог.

Лень мать изобретательности ...

+0

Я думаю, они сказали, что о войне ... Я попробую. Нужно установить псевдоним (cygwin). – user2316667

+0

Ух, нужен новый setup.exe. Еще 2 секунды. – user2316667

+0

Работает! Но теперь я сумасшедший, потому что cd $ DOCS должен для всех целей сработал ... Не могли бы вы объяснить, почему переменная не работала при вводе вручную (что изменила переменная ДОЛЖНО была расширена)? Если что-то превзойдет мою лень, это любопытство. – user2316667

5
$ DOCS="/cygdrive/c/Users/my\ dir/Documents" 

Вот ваша первая проблема. Это ставит фактический символ обратной косой черты в $DOCS, как вы можете увидеть, выполнив команду:

$ echo "$DOCS" 
/cygdrive/c/Users/my\ ` 

При определении DOCS, вам нужно бежать символ пробела. Вы можете процитировать строку (используя одиночные или двойные кавычки) или вы можете избежать только символа пробела с помощью обратного слэша. Вы не можете обойти оба. (В большинстве Unix-подобных систем вы можете иметь обратную косую черту в имени файла или каталога, хотя это не очень хорошая идея. В Cygwin или Windows \ является разделителем каталогов. Но я собираюсь предположить фактическое имя каталог my dir, не my\ dir.)

$ cd $DOCS 

Это проходит два аргумента cd. Первый - cygdrive/c/Users/my\, а второй - dir/Documents. Случается, что cd спокойно игнорирует все, кроме первого аргумента, что объясняет сообщение об ошибке:

-bash: cd: /cygdrive/c/Users/my\: No such file or directory 

Чтобы установить $DOCS на имя вашего Documents каталога, выполните одно из них:

$ DOCS="/cygdrive/c/Users/my dir/Documents" 
$ DOCS='/cygdrive/c/Users/my dir/Documents' 
$ DOCS=/cygdrive/c/Users/my\ dir/Documents 

После вы сделали это, чтобы перейти в свой каталог Documents, приложите ссылку на переменную в двойных кавычках (это хорошая идея для любая ссылка в bash, если вы не уверены, что в этом значении нет смешных символов):

$ cd "$DOCS" 

Вы также можете подумать о том, чтобы предоставить этому каталогу имя без каких-либо пробелов в нем, хотя это может быть сложно сделать вообще в Windows.

1

Если вы хотите, чтобы перейти от c:\ и вы хотите пойти в c:\Documents and settings, написать на консоли: c:\Documents\[space]+tab и Cygwin будет автозаполнение как c:\Documents\ and\ settings/

0

ок я провел некоторое разочарование время с этой проблемой тоже. Мой маленький гид.

Открыть рабочий стол, например. Если вы вратаря переключить диск в CMD, типа:

кд настольный

Теперь, если вы хотите отобразить вложенные папки:

кд, сделать 1 Spacebar и нажмите вкладку 2 раза

Теперь, если вы хотите ввести каталог/файл с ПРОСТРАНСТВО В ИМЯ. Позволяет открыть некоторые файла имя F.G., чтобы открыть его, мы должны набрать:

CD файл \ имя

P.S. заметить это место после того, как слэш :)

3

РЕШЕНИЕ:

cd "Documents and Photos" 

проблема решена.

Причина, по которой я отправляю этот ответ: вы обнаружите, что StackOverflow используется пользователями каждый день (а не только веб-разработчиками, программистами или опытными пользователями), и это был результат номер один для простого вопроса пользователя Windows в Google.

Люди становятся все более технически подкованными, но не обязательно знакомы с командной строкой в ​​приведенных выше случаях.

0

Просто поместите папку в одинарные кавычки

, например

C:\> cd my folder 

будет

C:\> cd 'my folder' 
Смежные вопросы