Thách thức : viết một tệp tập lệnh duy nhất foo.cmd
có thể được gọi từ cmd.exe
dấu nhắc Windows vanilla (không phải PowerShell, không ở chế độ quản trị viên), để thực thi mã cụ thể của Windows ...
> .\foo.cmd
Hello Windows!
... mà còn được gọi không thay đổi gì từ một điển hình POSIX-compliant (Linux / OSX) shell prompt ( bash
, tcsh
hay zsh
), để thực hiện tùy tiện đang POSIX cụ thể:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... mà không yêu cầu cài đặt hoặc tạo trình thông dịch / công cụ của bên thứ ba.
Tôi biết điều này là có thể, nhưng với cruft (tức là trên Windows, một hoặc hai dòng rác / thông báo lỗi được in thành thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn trước "Xin chào Windows!").
Tiêu chí chiến thắng là tối thiểu hóa (thứ nhất) số lượng dòng cruft và (thứ hai) số lượng ký tự cruft.
Cruft có thể được định nghĩa là bất kỳ đầu ra giao diện điều khiển (stdout hoặc stderr) không được sản xuất bởi mã tải trọng (tùy ý). Các dòng trống được tính trong số dòng. Dòng mới không được tính vào số lượng nhân vật. Điểm số Cruft nên được tổng hợp trên cả hai nền tảng. Chúng ta hãy bỏ qua các cơ chế như thế cls
để quét sạch hành trình nhưng với chi phí cũng làm trống đầu ra thiết bị đầu cuối trước đó. Nếu Windows lặp lại các lệnh của bạn vì bạn chưa bật @echo off
, hãy loại trừ các ký tự mà nó dành để in thư mục hiện tại và lời nhắc.
Một tiêu chí phụ là sự đơn giản / thanh lịch của giải pháp bên trong foo.cmd
: nếu "cơ sở hạ tầng" được định nghĩa là bất kỳ ký tự nào không liên quan trực tiếp đến mã tải trọng tùy ý, thì trước tiên giảm thiểu số lượng dòng chứa ký tự cơ sở hạ tầng và thứ hai tổng số cơ sở hạ tầng nhân vật.
Thêm kudos nếu phần POSIX sẽ hoạt động mặc dù tệp có kết thúc dòng CRLF! (Tôi không chắc rằng phần cuối thậm chí có thể.)
Giải pháp hiện tại của tôi, mà tôi sẽ đăng ở đây một khi những người khác có cơ hội, sử dụng 6 dòng mã cơ sở hạ tầng (52 ký tự không bao gồm dòng mới). Nó tạo ra 5 dòng cruft, hai trong số đó là trống, tất cả đều xảy ra trên Windows (30 ký tự không bao gồm dòng mới và loại trừ chuỗi thư mục / dấu nhắc hiện tại xuất hiện trên hai trong số các dòng đó).