Cygwin - cd в скрипте bash


12

Я новичок в использовании Cygwin, поэтому извиняюсь, если это очень новый вопрос.

У меня есть сценарий Bash, где я "CD" в каталог, а затем сделать что-то в этом каталоге. Тем не менее команда cd завершается ошибкой с «Нет такого файла или каталога / c / code / blah / blah».

Если я скопирую строку cd прямо в командную строку, то она будет работать нормально. Это просто не удается в сценарии.

[edit] В соответствии с просьбой, я добавил фактические строки из скрипта:

#!/bin/bash
cd /c/Code/Project

Спасибо за любую помощь с этим,
Дэн.


1
Можете ли вы опубликовать фактические строки из сценария?
Приостановлено до дальнейшего уведомления.

Ответы:


18

Какие типы окончаний строк есть в вашем сценарии? Для правильной работы bash-скрипта Cygwin (без необходимости установки специальных опций) он должен иметь окончания строки Unix (LF), а не окончания строки DOS (CR-LF). Если вы сохранили скрипт с окончанием строки DOS, bash увидит ваш аргумент cdas /c/Code/Project^M, где ^MCR, и не найдет каталог с таким именем.

Чтобы увидеть, какие у него окончания концов , вы можете выполнить file scriptname, где scriptname - это имя вашего скрипта. Чтобы преобразовать скрипт, чтобы он имел окончания строки Unix, выполните d2u scriptname.

Не используйте Блокнот для редактирования скриптов Cygwin Bash. Он всегда сохраняет файлы с окончанием строки DOS.


Ага! Вот и все. Я использовал Vim для редактирования. Спасибо :-)
Дэн

Vim будет работать нормально. Он автоматически определяет, имеют ли файлы конец строки Unix или DOS, и сохраняет их таким же образом. По умолчанию Cygwin vim создает новые файлы с окончаниями строк Unix, но Windows gvim создает новый файл с окончаниями строк DOS. Вы можете изменить это. Смотрите :help ffи :help ffs.
garyjohn

Emacs также сохранял с CR-LF. Изменение стиля окончания строки в редакторе: emacswiki.org/emacs/EndOfLineTips
jfklein

3

Если вы не переопределите, скрипт выполняется в своей собственной копии оболочки (обычно Bash). Затем, когда скрипт завершается, этот экземпляр bash также завершается. Таким образом, ваш сценарий компакт-дисков в новый каталог, а затем завершается, возвращая вас к исходному Bash - который никогда не делал CD.

Два способа обойти это. Вы можете использовать псевдоним вместо скрипта, например, в вашем .profile

alias mycd="cd /c/Code/Project"

Другой способ - сказать Bash не создавать подоболочку, используя синтаксис "точка"

. myscript

Вы неправильно поняли мой вопрос. Сообщение об ошибке, о котором я спрашивал, записывается в стандартный вывод командой cd, которая находится внутри скрипта. Я не прошу, чтобы текущий каталог был изменен после выхода из скрипта.
Дан

У меня была похожая проблема с ОП, но без ошибок; этот ответ мне очень помог, даже если он не "на 100% по теме".
Морозный Z


1

Пытаться:

cd /cygdrive/c/code/blah/blah


Это будет работать для 'cd c:/code/blah/blah«не для 'cd /c/code/blah/blah». Кроме того, c:форма ' ' также работает из скрипта; Здесь чего-то еще не хватает, вопрос требует большей проработки.
Ник

Это не сработало.
Дэн

@nik форма c: тоже не работает. Ничего, что я пробую, не работает из сценария. Все они работают из командной строки.
Дэн

1

У меня нет репутации, чтобы комментировать или голосовать, но ответ CarlF помог мне.

«Таким образом, ваши скриптовые CD попадают в новый каталог, а затем завершаются, возвращая вас к исходному Bash, который никогда не создавал CD».

Тот же скрипт, но в моем случае сообщения об ошибке нет.

Это сработало для меня:

, myscript.sh

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.