Nội dung bình luận cho Bash?


142

Tôi muốn có thể nhận xét một cờ duy nhất trong lệnh một dòng. Bash dường như chỉ có from # till end-of-lineý kiến. Tôi đang xem các thủ thuật như:

ls -l $([ ] && -F is turned off) -a /etc

Nó xấu, nhưng tốt hơn là không có gì. Có cách nào tốt hơn?

Những điều sau đây có vẻ hiệu quả, nhưng tôi không chắc liệu nó có khả dụng hay không:

ls -l `# -F is turned off` -a /etc

Thủ #commentthuật cũng được đề cập ở đây: stackoverflow.com/questions/9522631/
Juha Palomäki

1
Theo liên kết được đề cập bởi @Juha Palomäki, có một mẹo tuyệt vời được ${IFS#comment}giới thiệu bởi @pjh trong các bình luận. Không có vỏ phụ được gọi.
alexis

Câu trả lời:


110

Sở thích của tôi là:

Bình luận trong một kịch bản Bash

Điều này sẽ có một số chi phí, nhưng về mặt kỹ thuật nó trả lời câu hỏi của bạn

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

Và đối với đường ống cụ thể, có một giải pháp sạch hơn không có chi phí

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Cách đặt nhận xét dòng cho lệnh nhiều dòng


3
Lưu ý rằng bạn phải sử dụng backticks, $(#comment)không hoạt động.
funroll

1
Một số phiên bản sẽ coi đó )là một phần của bài bình luận. Hầu hết các thách thức của bash là do khả năng tương thích retro với các phiên bản cũ hơn và một chiến lược phổ biến là sử dụng giải pháp lâu đời nhất có thể.
Rafareino

2
Lưu ý, đây không phải là một nhận xét thực sự: true && `# comment` && truelà một biểu thức hợp lệ. Một nhận xét thực sự sẽ tạo ra một cái gì đó như: syntax error near unexpected token && '`
Sebastian Wagner

Bạn nói đúng @sebastianwagner, cũng lưu ý rằng nó sẽ thất bại trong một mạch ngắn HOẶC hoặc một cái gì đó tương tự, nhưng tôi nghĩ rằng nó tốt như chúng ta có thể nhận được mà không làm phức tạp mọi thứ. Đối với tôi đó là một dấu hiệu cho thấy một người cần một ngôn ngữ tốt hơn, nhưng nó có thể làm rất tốt, duy trì mã đã được xây dựng với các 'coments' như vậy để ghi lại nó.
Rafareino

Cảm ơn đã giúp tôi ra ngoài!
xiarnousx

58

Tôi thấy dễ dàng nhất (và dễ đọc nhất) khi chỉ sao chép dòng và nhận xét phiên bản gốc:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

Upvote cho rõ ràng. Không biết tại sao đây không phải là lựa chọn đầu tiên.
David Tabernero M.

Nhưng sau đó nó không phải là nội tuyến? Tôi cho rằng công bằng khi nói rằng cần phải làm những việc không được hỗ trợ bởi bash là lý do để tìm cách khác
ThorSummoner

25

$(: ...) là một chút xấu xí, nhưng vẫn không tốt.


2
Theo cú pháp này, bạn đang bắn một lớp vỏ phụ, một nhận xét được đặt ra để cải thiện khả năng sửa đổi mà không thay đổi hành vi mã, nhưng thời gian để lau / kết thúc lớp vỏ phụ này sẽ làm cho mã của bạn chậm hơn (ít nhất là nói), Tại sao không chỉ sử dụng dấu hai chấm khi bắt đầu một dòng mới?
Rafareino

1
Với $ {IFS # ...}, không có lớp vỏ phụ nào được gọi.
alexis

3
@Rafareino: vâng. Nhưng nghiêm túc, trong 95% ứng dụng, chi phí này không thành vấn đề. Đối với nhiều trường hợp có vấn đề, có lẽ nên sử dụng ngôn ngữ nhanh hơn Bash ngay từ đầu.
rẽ trái

... rắc rối là, $(: ...)cú pháp dường như không thực sự cho phép nhúng các bình luận: trong khi đó echo "foo" `# comment` "bar"sẽ chấm dứt bình luận ở backtick thứ hai, tương đương được cho là echo "foo" $(: # comment) "bar"không phân tích bất cứ điều gì đằng sau #.
rẽ trái

4

Làm thế nào về việc lưu trữ nó trong một biến?

#extraargs=-F
ls -l $extraargs -a /etc

4

Đây là giải pháp của tôi cho các bình luận nội tuyến ở giữa nhiều lệnh đường ống.

Ví dụ mã không ghi chú:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Giải pháp cho nhận xét đường ống (sử dụng chức năng trợ giúp):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

Hoặc nếu bạn thích, đây là giải pháp tương tự không có chức năng trợ giúp, nhưng nó hơi rắc rối hơn:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
Ở một khía cạnh khác, nếu bạn di chuyển ký tự ống dẫn đến cuối dòng trước đó, bạn có thể thoát khỏi dấu gạch chéo ngược mới.
tripleee

3

Hầu hết các lệnh cho phép args đến theo thứ tự bất kỳ. Chỉ cần di chuyển các cờ nhận xét đến cuối dòng:

ls -l -a /etc # -F is turned off

Sau đó, để bật lại, chỉ cần bỏ ghi chú và xóa văn bản:

ls -l -a /etc -F

1
chết tiệt, tôi đã thêm #mà không có một khoảng trắng sau lệnh. cảm ơn bạn!
vào

1

Nếu bạn biết một biến là trống, bạn có thể sử dụng nó như một bình luận. Tất nhiên nếu nó không trống thì nó sẽ làm rối lệnh của bạn.

ls -l $ {1 # -F bị tắt} -a / etc

§ 10.2. Thông số thay thế


Sử dụng ${name:=comment}để được an toàn.
can-ned_food

1

Để vô hiệu hóa một phần của lệnh như thế a && b, tôi chỉ cần tạo một tập lệnh trống xtrên đường dẫn, vì vậy tôi có thể làm những việc như:

mvn install && runProject

khi tôi cần xây dựng, và

x mvn install && runProject

khi không (sử dụng Ctrl + ACtrl + Eđể di chuyển đến đầu và cuối).

Như đã lưu ý trong các bình luận, một cách khác để làm điều đó là Bash tích hợp :thay vì x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
Một nội dung như vậy đã tồn tại: :Như trong:string; of; commands; : disabled; enabled;
xenithorb

Thậm chí tốt hơn :) Cảm ơn
Ondra ižka

-1

Nếu nhận xét là đáng để thực hiện, nó có thể có thể đi ở cuối dòng, hoặc trên một dòng trên chính nó. Tôi hiếm khi tìm thấy một nhu cầu bình luận nội tuyến với mã trước và sau khi nhận xét bằng bất kỳ ngôn ngữ nào.

Ồ, có một ngoại lệ, đó là phương ngữ của SQL tôi thường sử dụng sử dụng '{bình luận}'. Thỉnh thoảng, tôi sẽ viết:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Nhưng ngay cả đó là một sự kéo dài.

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.