Nhận xét có thể đọc được trên các dòng riêng biệt trong lệnh bash nhiều dòng với đường ống?


14

Khi tạo tập lệnh shell bằng cách sử dụng đường ống và sử dụng dấu gạch chéo ngược để tiếp tục các dòng, tôi muốn chèn nhận xét trên các dòng riêng biệt , theo kiểu mạnh mẽ, dễ đọc và di động.

Ví dụ: được cung cấp lệnh đa dòng không bị lỗi này (bị đánh cắp từ @DigitalRoss vì sự rõ ràng của nó):

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... Dưới đây là gần nhất về mặt thẩm mỹ với những gì tôi muốn thực hiện, nhưng vì lý do rõ ràng, không hoạt động ... và vâng, tôi nhận thức rõ rằng đây không phải là thứ thường đáng để bình luận:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

Các câu trả lời liên quan hiện có dường như không thỏa đáng với tôi , như sau:

Đầu tiên, câu trả lời của glenn jackman (thêm đối số vào một mảng và sau đó thực thi mảng) hoạt động cho các lệnh đơn lẻ, nhưng không hoạt động đối với đường ống (và ngay cả khi nó đã làm, nó làm tăng thêm sự phức tạp mà tôi muốn tránh).

Thứ hai, câu trả lời của @Gilles ở đây (sử dụng :) cũng dường như không hoạt động với đường ống, bởi vì nó làm thay đổi dòng chảy của đường ống:

$ echo "abc" | :
$

( Chú ý : Nếu có một tương đương :mà đi ra chưa sửa đổi, đó sẽ là thẩm mỹ có thể chấp nhận, nhưng tôi đã không thể tìm thấy một tôi có thể viết một tùy chỉnh, nhưng nó sẽ làm giảm tính di động..)

Cuối cùng, phần cuối của câu trả lời của DigitalRoss trên StackOverflow hoạt động tốt để thêm nhận xét trên cùng một dòng, nhưng tôi rất thích nhận xét về các dòng riêng biệt. Mặt khác, khi các dòng có độ dài khác nhau, khả năng đọc bị giảm:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

Tôi đang tìm kiếm câu trả lời bảo tồn khả năng đọc và giảm thiểu độ phức tạp, hoặc một số nền tảng khác về lý do tại sao những gì tôi đang tìm kiếm là không khả thi.


1
Lưu ý về ý kiến ​​của bạn: Tôi được dạy viết bình luận giải thích một phần hoặc đơn vị công việc. Nếu một lập trình viên có kinh nghiệm viết các bình luận thông minh mô tả những gì họ đang làm, thì có lẽ bất cứ ai đi cùng duy trì tập lệnh luôn có thể sử dụng các trang man nếu họ không hiểu chi tiết về cách sử dụng. Không bao giờ nên viết bình luận như thế i++; // increment i by one. Tôi đề nghị bạn đọc "Các yếu tố của phong cách lập trình"
bsd

Tôi nghĩ rằng tôi sẽ xóa bản chỉnh sửa cuối cùng. Thật không bình thường khi một câu hỏi chứa câu hỏi, từ chối câu trả lời và chính câu trả lời, nhưng phần giải thích tại sao các câu trả lời khác không hoạt động là điều cần thiết ở đây. Câu trả lời của rozcietrzewiacz và bình luận của bạn cùng nhau giải thích vấn đề (cá nhân tôi sẽ đăng một câu trả lời riêng và chấp nhận nó, vì vấn đề này khá khác so với những gì anh ấy mô tả, nhưng điều này hoạt động)
Michael Mrozek

Hiểu - cảm ơn đã phản hồi; bài học kinh nghiệm!
Royce Williams

Câu trả lời:


14

Còn cái này thì sao?

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

(Dấu gạch chéo ngược cần được sử dụng làm ký tự cuối cùng trong các dòng đó.) Tôi không chắc về tính di động của phương pháp đó, nhưng nó chắc chắn hoạt động với hiện tại bash.


Aha! (facepalm) Tôi đã chuyển đổi thành ngữ tôi thực sự sử dụng khi đăng câu hỏi mà không nhận ra nó! Tôi đã đặt ống ở đầu mỗi dòng, điều mà tôi rất vui khi ngừng làm bây giờ vì tôi biết rằng phương pháp này hoạt động tốt trên tất cả các hệ thống tôi có thể tiếp cận, trong cả bash và sh. Cảm ơn!
Royce Williams

Những bình luận đó có làm hỏng các phần tiếp theo không?
Stuart P. Bentley ngày

Miễn là có một dòng trống trước mỗi bình luận, nó hoạt động tốt.
Royce Williams
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.