2011-11-27 40 views
18

Tôi biết khi nào Cygwin cài đặt có một tệp lô được sử dụng để khởi chạy nó trong Windows. Nhưng nếu tôi muốn chạy một tập lệnh mà không cần khởi chạy Cygwin và thực hiện "./script"Cygwin chạy tập lệnh từ một tập tin batch?

Làm cách nào để tạo tệp lô để thực hiện điều đó?

Như trong ... chỉ có một tệp lô khi được nhấp, mở Cygwin và chạy tập lệnh trình bao.

Trả lời

27

Để chạy "foo.bsh", tạo một tập tin thực thi với các nội dung sau và chạy nó:

set PATH=C:\cygwin\bin;%PATH% 
    c:\cygwin\bin\bash.exe c:\path\to\foo.bsh 

Các "C: \ Cygwin \ bin" một phần có thể khác nhau tùy thuộc vào lựa chọn của bạn cài đặt vị trí của Cygwin.

+0

có tác phẩm này .. cảm ơn – dhroove

3

Loại kịch bản lệnh shell nào? Bash? Nếu bạn cần chạy một tập lệnh bash, chỉ cần chạy nó với bash.exe thông qua một phím tắt. Mục tiêu sẽ là một cái gì đó như:

C:\cygwin\bin\bash.exe foo.bsh 

Đường dẫn đến bash.exe sẽ phụ thuộc vào nơi Cygwin được cài đặt. (Bạn không cần đường dẫn nếu thư mục bin nằm trong biến môi trường đường dẫn của bạn.)

Bạn có thể làm điều tương tự trong tập lệnh theo lô nếu muốn. Dòng lệnh sẽ giống như "target" ở trên.


EDIT DỰA VÀO NHẬN XÉT (vẫn giả định bash):

Ok, vì vậy trong kịch bản batch (.bat) chỉ cần gõ:

bash.exe script.txt 

Bạn có thể cần phải thêm đường dẫn đến "bash.exe". Nếu bạn không chắc chắn nơi "bash.exe" là, hãy mở tệp "Cygwin.bat" mà bạn đã đề cập trong câu hỏi của mình. Nó sẽ có đường dẫn trong lệnh chdir. (Lưu ý: Cygwin.bat chỉ chạy bash.exe ở chế độ tương tác. Nó không thực sự chạy bất cứ thứ gì có tên "cygwin".)

Bạn cũng sẽ cần phải thêm đường dẫn đến "script.txt" nếu nó không phải là trong cùng thư mục với tập lệnh batch của bạn.

Một lần nữa, thao tác này cũng sẽ hoạt động trong lối tắt thay vì tập lệnh theo lô.

+0

Vâng, tôi muốn chạy tập lệnh trình bao. Nhưng tôi không muốn phải mở Cywgin sau đó gõ tất cả những thứ đó để thực thi nó. Tôi chỉ muốn chạy một tập tin thực thi để mở Cygwin và sau đó làm theo cách đó nếu có thể. – Aaron

+1

@Aaron - Nhập tất cả nội dung nào? Bất kỳ dòng lệnh nào, bao gồm cả dòng lệnh args, bạn sử dụng để thực thi tập lệnh trong cygwin có thể được thêm vào lối tắt hoặc tập lệnh batch. Cygwin sẽ không mở, nhưng một cửa sổ cmd sẽ xuất hiện. Nó sẽ đóng khi kịch bản đã chạy xong. –

+0

Tôi có một kịch bản lệnh shell mà tôi chạy trong Cygwin. Tôi đã tự hỏi nếu tôi có thể tạo một tập tin thực thi mà sẽ làm tất cả cho tôi thay vì gõ tất cả? Nhưng tôi không chắc chắn làm thế nào để sử dụng Cygwin trong tập tin thực thi. – Aaron

8

Bạn có thể thử một cái gì đó như thế này để tấm bạt lò xo từ CMD để BASH (hoặc bất kỳ sh-biến thể):

: <<TRAMPOLINE 
    @echo off 
    bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1) 
    bash "%~f0" "%*" 
    goto :EOF 
    TRAMPOLINE 
    ##################### 
    #!/bin/bash -- it's traditional! 
    echo "Hello from $SHELL" 
+1

Điều này làm việc độc đáo đối với tôi, nhưng tôi thấy tôi đã phải sử dụng kết thúc dòng phong cách UNIX khi lưu tệp để đảm bảo rằng tập lệnh bash rất vui. – gdt

5

tôi muốn mở rộng trên câu trả lời được đưa ra bởi Austin Hastings để cho phép nó làm việc mà không Cygwin trong đường dẫn và làm việc trong thiết lập thư mục với tệp dơi (vì vậy ngay cả một lối tắt có đường dẫn "Bắt đầu" khác được sử dụng). Các thay đổi là bao gồm đường dẫn đầy đủ để bash, sử dụng tùy chọn -l để thiết lập bash đúng cách với đường dẫn và môi trường và vượt qua thư mục hiện tại để bash làm đối số đầu tiên được xuất hiện (sử dụng shift). Hãy nhớ sử dụng các dòng mới của Unix trong tệp hoặc bạn sẽ nhận được rất nhiều lỗi. Cũng sử dụng UTF8 thay vì ANSI.

: <<TRAMPOLINE 
@echo off 
C:\cygwin\bin\bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1) 
setlocal EnableDelayedExpansion 
for %%i in (%*) do set _args= !_args! "%%~i" 
C:\cygwin\bin\bash -l "%~f0" "%CD%" %_args% 
goto :EOF 
TRAMPOLINE 
##################### 
#!/bin/bash -- it's traditional! 
cd "$1" 
shift 
echo Working from $PWD 

Chỉnh sửa: Cố định mã trampoline để chuyển đối số đúng cách để bash. Các tệp BAT không có bash tương đương với "$ @" và xử lý vòng lặp mỗi đối số được thực hiện và sau đó được chuyển tới bash.exe. Bây giờ xử lý đúng đối số bằng dấu cách.

+0

Làm cách nào để thoát khỏi lệnh này? đặt 'exit/B' sau' TRAMPOLINE' không hoạt động. –

+0

Chỉ cần nhập 'thoát' làm môi trường sau dòng' TRAMPOLINE' trong 'bash'. 'exit/B' là lệnh' cmd'. – galmok

+0

Tôi hỏi vì trong trường hợp của tôi 'lối ra' có vẻ như nó không hoạt động. Tôi đã phát hiện ra rằng đó là vì tôi đã tạo một shell đăng nhập (-I) và một cái gì đó trong '.bashrc' của tôi đã tạo ra các thể hiện bash được treo xung quanh nền (do đó ngăn chặn thoát khỏi việc thoát khỏi cửa sổ cmd) . –

0

Để chạy "your_bash_file" từ bất kỳ tập tin .bat, viết dòng sau vào .bat:

git-bash.exe (path_to_your_bash_file>)

T.B. Windows Git là cần thiết được cài đặt

1

Nếu bạn muốn mở tập lệnh trong cửa sổ màu bạc hà, điều này (dựa trên câu trả lời của @ galmok) sẽ thực hiện thủ thuật.

: <<TRAMPOLINE 
@echo off 
C:\Users\user\Downloads\cyg-packages\bin\bash -c "exit 0" || (echo.No bash found in PATH! & exit /b 1) 
setlocal EnableDelayedExpansion 
for %%i in (%*) do set _args= !_args! "%%~i" 
C:\Users\user\Downloads\cyg-packages\bin\mintty.exe -i /Cygwin-Terminal.ico C:\Users\user\Downloads\cyg-packages\bin\bash -l "%~f0" "%CD%" %_args% 
goto :EOF 
TRAMPOLINE 
##################### 
#!/bin/bash -- it's traditional! 
cd "$1" 
shift 
echo Working from $PWD 
vim "[email protected]" 

Lưu ý: use-case của tôi là cần phải mở một terminal vim từ Visual Studio, đó là lý do tại sao có một cuộc gọi đến vim ở cuối. Tập tin batch sẽ thoát ra sau đó.

Các vấn đề liên quan