Cygwin - CD в баш-скрипті


12

Я новачок у використанні Cygwin, тож вибачте, якщо це дуже новачок.

У мене є скрипт bash, де я "cd" до каталогу, а потім робити щось у цьому каталозі. Однак команда cd не вдається "Немає такого файлу чи каталогу / c / code / blah / blah".

Якщо я скопіюю cd-рядок прямо у підказку оболонки, то він прекрасно працює. Це просто провалюється в сценарії.

[ред.] Як вимагається, я додав фактичні рядки зі сценарію:

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

Дякую за будь-яку допомогу в цьому,
Ден.


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

Відповіді:


18

Які закінчення рядків має ваш сценарій? Щоб скрипт Cygwin bash працював належним чином (без необхідності встановлення спеціальних параметрів), він повинен мати закінчення рядків Unix (LF), а не закінчення рядків DOS (CR-LF). Якщо ви зберегли скрипт із закінченнями рядка DOS, bash побачить ваш аргумент cdяк /c/Code/Project^M, де ^MCR, і не знайде каталог з таким іменем.

Для того, щоб побачити , який тип лінії закінчень має, ви можете виконати file scriptname, де імяскріпта це ім'я вашого сценарію. Щоб перетворити скрипт таким чином, щоб у ньому були закінчення Unix, виконайте його d2u scriptname.

Не використовуйте Блокнот для редагування скриптів на базі Cygwin. Він завжди зберігає файли з закінченнями рядка DOS.


Ага! Це було все. Я використовував Vim для редагування. Дякую :-)
День,

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

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

3

Якщо ви не перекриєте, сценарій виконує у власній копії оболонки (зазвичай Bash). Потім, коли сценарій закінчується, цей екземпляр bash також виходить. Тож ваш компакт-диск із сценарієм переходить у новий каталог, а потім виходить, повертаючи вас до оригінального Bash - який ніколи не робив компакт-диск.

Два способи обійти це. Ви можете використовувати псевдонім замість сценарію, наприклад, у своєму .profile have

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

Інший спосіб - сказати Bash не породжувати підрозділ, використовуючи синтаксис "крапка"

. myscript

Ви неправильно прочитали моє запитання. Повідомлення про помилку, про яке я запитував, записується в stdout командою cd, яка знаходиться в сценарії. Я не прошу, щоб поточний каталог було змінено, коли сценарій закінчується.
День

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


1

Спробуйте:

cd /cygdrive/c/code/blah/blah


Це буде працювати для 'cd c:/code/blah/blah"не для 'cd /c/code/blah/blah". Також c:форма ' ' працює і зі сценарію; Щось іншого тут бракує, питання потребує більш детального опрацювання.
nik

Це не спрацювало.
День

@nik c: форма також не працювала. Нічого, що я пробую, працює зі сценарію. Всі вони працюють з командного рядка.
День

1

Я не маю репутації коментувати чи голосувати, але відповідь КарлФ допомогла мені.

"Отже, ваші компакт-диски з скриптом переходять у новий каталог, а потім виходять, повертаючи вас до оригінального Bash - який ніколи не робив компакт-диск."

Той самий сценарій, але в моєму випадку немає повідомлення про помилку.

Це працювало для мене:

. myscript.sh

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.