Có một số cách thực hiện các lệnh khác nhau trên bash
và cmd
cùng một tập lệnh.
cmd
sẽ bỏ qua các dòng bắt đầu bằng :;
, như đã đề cập trong các câu trả lời khác. Nó cũng sẽ bỏ qua dòng tiếp theo nếu dòng hiện tại kết thúc bằng lệnh rem ^
, vì ^
ký tự sẽ thoát khỏi ngắt dòng và dòng tiếp theo sẽ được coi là nhận xét bởirem
.
Đối với việc bash
bỏ qua các cmd
dòng, có nhiều cách. Tôi đã liệt kê một số cách để làm điều đó mà không vi phạm các cmd
lệnh:
#
Lệnh không tồn tại (không được khuyến nghị)
Nếu không có #
lệnh nào khả dụng cmd
khi chạy tập lệnh, chúng ta có thể thực hiện việc này:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Ký #
tự ở đầu cmd
dòng bash
coi dòng đó như một nhận xét.
Ký #
tự ở cuối bash
dòng được dùng để nhận xét về \r
nhân vật, như Brian Tompsett đã chỉ ra trong câu trả lời của mình . Nếu không có điều này, bash
sẽ gây ra lỗi nếu tệp có \r\n
phần cuối dòng, được yêu cầu bởi cmd
.
Bằng cách đó # 2>nul
, chúng tôi đang lừa cmd
để bỏ qua lỗi của một số #
lệnh không tồn tại , trong khi vẫn thực hiện lệnh sau đó.
Không sử dụng giải pháp này nếu có một #
lệnh có sẵn trên PATH
hoặc nếu bạn không có quyền kiểm soát các lệnh có sẵn cmd
.
Sử dụng echo
để bỏ qua #
ký tự trêncmd
Chúng tôi có thể sử dụng echo
với đầu ra của nó được chuyển hướng để chèn cmd
các lệnh vào bash
khu vực đã nhận xét của:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Vì #
ký tự không có ý nghĩa đặc biệt trên cmd
, nó được coi là một phần của văn bản echo
. Tất cả những gì chúng ta phải làm là chuyển hướng đầu ra của echo
lệnh và chèn các lệnh khác sau nó.
#.bat
Tệp trống
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
Các echo >/dev/null # 1>nul 2> #.bat
dòng tạo ra một sản phẩm nào #.bat
tập tin trong khi trên cmd
(hoặc thay thế hiện có #.bat
, nếu có), và không có gì trong khi trên bash
.
Tệp này sẽ được sử dụng bởi cmd
(các) dòng theo sau ngay cả khi có một số #
lệnh khác trên PATH
.
Các del #.bat
lệnh trên cmd
đang cụ thể xóa các tập tin đã được tạo ra. Bạn chỉ phải làm điều này ở cmd
dòng cuối cùng .
Không sử dụng giải pháp này nếu #.bat
tệp có thể nằm trong thư mục làm việc hiện tại của bạn, vì tệp đó sẽ bị xóa.
Khuyến nghị: sử dụng here-document để bỏ qua cmd
các lệnh trênbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Bằng cách đặt ^
ký tự ở cuối cmd
dòng, chúng ta đang thoát khỏi dấu ngắt dòng và bằng cách sử dụng :
làm dấu phân cách ở đây tài liệu, nội dung dòng phân cách sẽ không có tác dụng cmd
. Bằng cách đó, cmd
sẽ chỉ thực hiện dòng của nó sau khi :
dòng kết thúc, có cùng hành vi như bash
.
Nếu bạn muốn có nhiều dòng trên cả hai nền tảng và chỉ thực thi chúng ở cuối khối, bạn có thể thực hiện điều này:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Miễn là không có cmd
dòng chính xác here-document delimiter
, giải pháp này sẽ hoạt động. Bạn có thể thay đổi here-document delimiter
thành bất kỳ văn bản nào khác.
Trong tất cả các giải pháp đã trình bày, các lệnh sẽ chỉ được thực thi sau dòng cuối cùng , làm cho hành vi của chúng nhất quán nếu chúng thực hiện cùng một điều trên cả hai nền tảng.
Các giải pháp đó phải được lưu vào tệp có dấu \r\n
ngắt dòng, nếu không chúng sẽ không hoạt động cmd
.