Làm cách nào để thực thi tệp .sh trên Windows?


67

Khi tôi đang cố thực thi một tệp (name.sh) trong dòng lệnh bằng lệnh ./name.sh, tôi nhận được lỗi rằng:

"." không được công nhận là một lệnh nội bộ hoặc bên ngoài, tệp có thể hoạt động hoặc bó

vui lòng giúp tôi thực hiện tập tin .sh

Câu trả lời:


74

Bạn đang sử dụng Windows CMD.EXE (từ thông báo lỗi). Nó sử dụng một cú pháp khác nhau để thực hiện các lệnh. Bạn sẽ cần sử dụng sh name.sh, giả sử rằng bạn đã cài đặt Cygwin hoặc tương tự.

Để làm rõ, Windows không có tiện ích tích hợp để hỗ trợ các tệp .sh. Để chạy như vậy, bạn sẽ cần cài đặt một công cụ của bên thứ ba như Cygwin .


7
Bạn cũng có thể không chỉ cài đặt Git trên Windows? Có vẻ như làm như vậy sẽ thêm hỗ trợ cho các tập lệnh shell ngay cả khi các tập lệnh shell đó không thực hiện các tác vụ liên quan đến Git.
DaveTheMinion

2
@DavidB Có, nó hoạt động nếu bạn đặt C: \ Program Files (x86) \ Git \ bin (hoặc bất cứ thứ gì có trên máy tính của bạn) trong PATH của bạn, bởi vì Git đặt tất cả các loại công cụ hữu ích ở đó bao gồm sh.exe
Sumyrda

1
@DavidB Vâng, Git Bash biết phải làm gì với nó, đúng không!
Huyền thoại

13

Bạn đang cố chạy một lệnh Linux tại Dấu nhắc lệnh của Windows.

Trên Linux, dấu gạch chéo phía trước là dấu phân cách đường dẫn. Trên Windows, dấu gạch chéo ngược là dấu phân cách đường dẫn và dấu gạch chéo về phía trước thường biểu thị một đối số.

Do đó, Windows nghĩ rằng bạn đang cố chạy một lệnh có tên "." và phân tích cú pháp đối số "/name.sh". Quy ước đúng sẽ là ". \ Name.sh". Ngoài ra, Windows sẽ tự động tìm kiếm thư mục hiện tại cho lệnh của bạn để bạn chỉ cần gõ "name.sh".

Vấn đề tiếp theo bạn sẽ gặp phải là Windows không biết tập lệnh sh là gì, một lần nữa đây là một điều của Linux. Bạn có thể giải quyết điều này bằng cách cài đặt Cygwin nếu bạn thực sự muốn hoặc cần chạy tập lệnh sh.

Tuy nhiên, đánh giá theo một trong những nhận xét trước đây của bạn, bạn cũng có thể đổi tên tập lệnh thành name.bat và xóa dòng "#! / Bin / sh". Bây giờ bạn có một tệp Batch mà Windows sẽ hiểu. Bạn có thể đọc thêm về các tập tin hàng loạt ở đây .


12

Ngoài ra, bạn có thể chuyển sang mặt tối và cài đặt Linux. Từ dấu nhắc:

sh runide.sh

hoặc là

sudo sh runide.sh

Chương trình của bạn sẽ chạy và bạn cũng sẽ có một hệ thống tốt hơn.


15
Điều đó giống như nói, "Hãy làm giàu và trả tiền cho ai đó để làm điều đó cho bạn"
Funkodebat

7

Giải pháp tốt nhất theo ý kiến ​​của tôi:

  • Tải xuống và cài đặt .git cho Windows

  • Nhấp chuột phải vào máy tính để bàn và nói "git bash here"

  • Thực thi tập lệnh của bạn như trong unix

  • Làm xong!

Thận trọng: Nhiều lệnh sẽ không hoạt động trên windows! Nhưng vẫn còn rất nhiều thứ cơ bản sẽ hoạt động.

Nếu bạn cần tập lệnh đó thường xuyên, bạn có thể muốn tạo một lối tắt (trên máy tính để bàn của bạn, vd):

  • Tạo một Shortcut để mintty.exetrên máy tính để bàn của bạn

  • Chỉnh sửa thuộc tính của phím tắt và thay đổi mục tiêu (giữ đường dẫn):

  • C:\Program Files\Git\usr\bin\mintty.exe" -h always /bin/bash -l -e 'D:\folder\script.sh'


Điều này không hoạt động. Khi tôi chạy @FOR / f "tokens = *"% i IN ('docker-machine env --shell cmd default') DO @% i. Tôi nhận được mã thông báo bất ngờ (
Steve Tomlin

5

Bạn đang cố gắng chạy xe của bạn bằng nước cam thay vì xăng. Windows chia sẻ các lệnh tương tự được lưu trữ trong các tệp .bat hoặc .cmd với các tập lệnh shell Unix / Linux / zOS Unix Subystem / * ix vì hai họ hệ điều hành này có chung tổ tiên là các máy DEC PDP-x.

Nếu bạn muốn hài lòng ngay lập tức, bạn sẽ cần cài đặt một môi trường cung cấp chương trình "sh.exe" hoặc chương trình "csh.exe" hoặc "bash.exe" (tsh.exe có ai không?)

Ngoài ra, nếu bạn biết các lệnh script Unix, rất rõ và bạn biết các lệnh tệp Windows .cmd và .bat, bạn có thể dịch tệp .sh thành tệp .bat hoặc .cmd. Mặc dù vậy, bạn sẽ thường gặp nhiều chương trình kiểu Unix không có tương đương trong Windows - grep, sed, vi, emacs, v.v. công cụ. Đặt nó trên một ổ đĩa flash, cho những dịp đặc biệt.


3

Ai đó đã nói điều gì đó về MS-DOS bằng cách sử dụng /cho các lệnh và \cho các đường dẫn. Điều này hơi sai lệch. Nhìn vào ví dụ của tôi:

C:\myfoo\foo\>cd../.. 
C:\myfoo\foo\>cd..\..

Không có sự khác biệt về hiệu lực. Có, nó không đúng với tất cả các hoạt động - câu trả lời thực tế chỉ đơn giản là Không , hoặc không có Cygwin hoặc SSHD mà bạn không thể.

Tôi chỉ biết bởi vì tôi đã ngu ngốc dành nửa ngày để cố gắng tìm ra những gì if then fieval, execlàm gì -Djava.somethingkhi được gọi.



1

Tôi tìm thấy một giải pháp khác biệt và dễ dàng, được gọi là UnixUtil .

Tải xuống và giải nén nó vào ổ C :. Đặt biến môi trường pathđể bao gồm C:\UnixUtils\usr\local\wbin.

Điều này quan trọng. KHÔNG đặt đường dẫn đếnC:\UnixUtils\bin


1

Để hoàn thiện, tôi muốn đề cập đến một tính năng mới của Windows Windows dành cho hệ thống Linux dành cho Linux 10. Các chi tiết được mô tả trong http://www.howtogeek.com/249966/how-to-install-and-use-the-linux- bash-shell-on-windows-10 /

Lưu ý rằng nó yêu cầu kích hoạt công tắc Chuyển đổi chế độ dành cho nhà phát triển của chế độ trực tuyến và kích hoạt tùy chọn của Windows Windows Subystem dành cho Linux (Beta).

Đối với bản thân tôi, tôi thấy rằng cài đặt Git cho Windows (dù sao tôi cũng đang sử dụng) là đủ.


1

Đây là một luồng cũ nhưng đối với những người chạy Windows 10. Chỉ cần mở các tính năng của cửa sổ từ bảng điều khiển 'Bật hoặc Tắt tính năng của Windows'

Chọn tính năng 'Hệ thống con Windows cho Linux'. Sau khi cài đặt, bạn có 'Bash' và thậm chí bạn có thể định cấu hình máy chủ Linux gốc trong bash. Và tất nhiên, lệnh sh, trong bash, cũng hoạt động.


0

Có thể vấn đề thực sự nằm trong tệp name.sh- bạn đang cố sử dụng .lệnh nhưng nó đang cố chạy một loại shell (ví dụ csh, tôi nghĩ) trong đó không phải là lệnh hợp lệ.

Vì vậy: có name.shbắt đầu với chính xác #!/bin/sh(nếu bạn thực sự đang cố gắng chạy sh)?


1
vâng, nó bắt đầu #! / bin / sh cd D: \ Raghu D: winzip32.exe -min -a -r D: \ p đó là nội dung của tệp

0

ok, có RẤT NHIỀU điều đó - bỏ #! / bin / sh và thay đổi độ mở rộng thành bat và nó có thể hoạt động với một vài sửa chữa khác. Sau đó, bạn chỉ có thể gọi nó bằng tên tệp của nó là tốt.

Cú pháp của tập lệnh shell unix và tệp bó windows không quá giống nhau. Cygwin, hoặc một đống lộn xộn với unxutils có thể tạo ra thứ gì đó sẽ hoạt động trong cả hai, nhưng trừ khi bạn TUYỆT ĐỐI chắc chắn môi trường luôn như vậy, nó không đáng để đau đầu


drop the #!/bin/sh, and change the extention to bat, and it might work with a few more fixes.Gì?! Tôi nghi ngờ bạn chưa bao giờ thử điều này ... Trên Windows, ngay cả các khả năng bash đơn giản nhất cũng không được hỗ trợ hoặc yêu cầu cú pháp dài.
Camilo Martin

Đoạn thứ hai nói về thực tế rằng nó có khả năng không hoạt động, nếu không có một lượng công việc hợp lý.
Journeyman Geek

Vâng, bạn nói đúng.
Camilo Martin

0

Nếu bạn có một hộp Linux trong nhà (hoặc cơ quan) và cắm vào cùng một mạng và mạng này an toàn, điều này có thể thực hiện thủ thuật:

  1. Tạo một thư mục chia sẻ trên Windows (khá dễ dàng, nhưng đảm bảo mạng an toàn trước những kẻ xâm nhập).
  2. Gắn kết nó trong Linux với mount //WinMachine/Share LinuxFolder(IIRC và yêu cầu Samba ).
  3. Sử dụng một cái gì đó như PuTTY , đăng nhập từ xa vào hộp Linux đó.
  4. Chạy lệnh của bạn trong thư mục được gắn kết.

0

Để chạy kịch bản shell từ các cửa sổ. Đầu tiên sử dụng lệnh: dos2unix sau đó bạn có thể sử dụng lệnh bình thường của mình: sh runide.sh

Điều này sẽ làm việc ra.


Xin lỗi, điều chỉnh nhẹ cần phải được thực hiện. Sử dụng lệnh: "dos2unix runide.sh" Kết quả: dos2unix: chuyển đổi tập tin runide.sh sang định dạng UNIX sau đó bạn sử dụng lệnh của mình: "sh runide.sh" Điều này chắc chắn sẽ chạy tập lệnh shell của bạn. Học tập vui vẻ
Sridhar GV

câu hỏi không phải là về định dạng tập tin, mà là về việc thiếu shell trong windows.
Archemar

0

Mặc dù các câu trả lời hiện có ở đây là chính xác tại thời điểm đó, Windows 10 hiện có tùy chọn bao gồm một phiên bản Ubuntu đã sửa đổi chạy vỏ bash đầy đủ .

Khi được thực thi, các tập lệnh có thể được chạy theo cách thông thường từ bên trong bash, ví dụ:

chmod +x myscript.sh
./myscript.sh

Nếu bạn muốn chạy tập lệnh trực tiếp từ Windows, bạn có thể tạo một lối tắt trong cùng thư mục và đặt 'Target' thành một cái gì đó như:

C:\Windows\System32\bash.exe -c "./myscript.sh"

Nếu đường dẫn của tập lệnh của bạn có liên quan đến vị trí của phím tắt (như ví dụ ở trên), hãy đảm bảo trường 'Bắt ​​đầu trong' cũng trống.

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.