Cygwin - cd trong tập lệnh bash


12

Tôi mới sử dụng Cygwin, vì vậy xin lỗi nếu đây là một câu hỏi rất mới.

Tôi có một tập lệnh bash trong đó tôi "cd" vào một thư mục sau đó làm một cái gì đó trong thư mục đó. Tuy nhiên, lệnh cd không thành công với "Không có tệp hoặc thư mục / c / code / blah / blah" như vậy.

Nếu tôi sao chép dòng cd trực tiếp vào dấu nhắc shell, thì nó hoạt động tốt. Nó chỉ thất bại trong kịch bản.

[sửa] Theo yêu cầu, tôi đã thêm các dòng thực tế từ tập lệnh:

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

Cảm ơn bạn đã giúp đỡ với điều này,
Dan.


1
Bạn có thể đăng (các) dòng thực tế từ tập lệnh không?
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


18

Kịch bản của bạn có những dòng kết thúc nào? Để tập lệnh bash Cygwin hoạt động chính xác (không phải đặt các tùy chọn đặc biệt), nó phải có các kết thúc dòng Unix (LF) thay vì các kết thúc dòng DOS (CR-LF). Nếu bạn đã lưu kịch bản với kết thúc dòng hệ điều hành DOS, bash sẽ thấy lập luận của mình để cdlàm /c/Code/Project^M, nơi ^Mlà một CR, và sẽ không tìm thấy một thư mục bằng tên đó.

Để xem loại kết thúc dòng nào, bạn có thể thực thi file scriptname, trong đó scriptname là tên của tập lệnh của bạn. Để chuyển đổi tập lệnh để nó có kết thúc dòng Unix, hãy thực thi d2u scriptname.

Đừng sử dụng Notepad để chỉnh sửa tập lệnh bash Cygwin. Nó luôn lưu các tập tin với kết thúc dòng DOS.


Aha! Điều đó là vậy đó. Tôi đã sử dụng Vim để chỉnh sửa nó. Thankyou :-)
Dan

Vim sẽ hoạt động tốt. Nó tự động phát hiện xem các tệp có kết thúc dòng Unix hoặc DOS hay không và sẽ lưu chúng theo cùng một cách. Theo mặc định, vim của Cygwin sẽ tạo các tệp mới với các kết thúc dòng Unix, nhưng gvim của Windows sẽ tạo tệp mới với các kết thúc dòng DOS. Bạn có thể thay đổi điều đó. Xem :help ff:help ffs.
garyjohn

Emacs cũng đã tiết kiệm với CR-LF. Thay đổi kiểu kết thúc dòng trong trình soạn thảo: emacswiki.org/emacs/EndOfLineTips
jfklein

3

Trừ khi bạn ghi đè, một tập lệnh thực thi trong bản sao của chính trình bao (thường là Bash). Sau đó, khi tập lệnh thoát, ví dụ bash đó cũng thoát. Vì vậy, tập lệnh CD của bạn vào một thư mục mới và sau đó thoát ra, đưa bạn trở lại Bash ban đầu - điều chưa bao giờ làm CD.

Hai cách để làm việc xung quanh nó. Bạn có thể sử dụng bí danh thay vì tập lệnh, ví dụ: trong .profile của bạn có

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

Một cách khác là bảo Bash không sinh ra một subshell bằng cách sử dụng cú pháp "dot"

. myscript

Bạn đã đọc sai câu hỏi của tôi. Thông báo lỗi tôi đã hỏi được ghi vào thiết bị xuất chuẩn bằng lệnh cd, nằm trong tập lệnh. Tôi không yêu cầu thư mục hiện tại đã bị thay đổi khi tập lệnh thoát.
Dan

Tôi đã có một vấn đề tương tự như OP nhưng không có lỗi; câu trả lời này đã giúp tôi rất nhiều, ngay cả khi nó không phải là "100% về chủ đề".
Frosty Z

2

Bạn có thể tìm thấy các tệp của mình trong / cygdrive / c ...


1

Thử:

cd /cygdrive/c/code/blah/blah


Điều đó sẽ làm việc cho 'cd c:/code/blah/blah"không phải cho 'cd /c/code/blah/blah". Ngoài ra, c:biểu mẫu '' cũng hoạt động từ một tập lệnh; Một cái gì đó còn thiếu ở đây, câu hỏi cần nhiều chi tiết hơn.
nik

Điều này đã không làm việc.
Dan

@nik the c: hình thức cũng không hoạt động. Không có gì tôi thử làm việc từ một kịch bản. Tất cả đều hoạt động từ dòng lệnh.
Dan

1

Tôi không có tiếng tăm để bình luận hay bình chọn nhưng câu trả lời của CarlF đã giúp tôi.

"Vì vậy, tập lệnh CD của bạn vào một thư mục mới và sau đó thoát ra, đưa bạn trở lại Bash ban đầu - điều chưa bao giờ làm CD."

Cùng một kịch bản, nhưng trong trường hợp của tôi, không có thông báo lỗi.

Điều này làm việc cho tôi:

. myscript.sh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.