Bash

在帶有管道的多行 bash 命令中的單獨行上的可讀註釋?

  • June 9, 2021

在使用管道創建 shell 腳本並使用反斜杠繼續行時,我想以健壯、可讀和可移植的方式在單獨的行上插入註釋。

例如,給定這個未註釋的多行命令(為了清晰起見,從@DigitalRoss 竊取):

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

…以下在美學上最接近我想要實現的目標,但由於顯而易見的原因,它不起作用……是的,我很清楚這通常不值得評論:

# 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

現有的相關答案對我來說似乎並不令人滿意,如下:

首先,格倫傑克曼的回答(向數組添加參數,然後執行數組)適用於單個命令,但不適用於流水線(即使它這樣做,它也會增加我想避免的複雜性)。

其次,@Gilles 在此處的回答(使用:)似乎也不適用於流水線,因為它改變了流水線的流程:

$ echo "abc" | :
$

注意:如果有一個等效的:輸出未修改,那在美學上是可以接受的,但我找不到一個。我可以寫一個自定義的,但它會降低可移植性。)

最後, DigitalRoss 在 StackOverflow 上的回答的最後一部分非常適合在同一行添加評論,但我更喜歡在單獨的行上添加評論。否則,當行的長度變化很大時,可讀性會降低:

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

我正在尋找保持可讀性和最小化複雜性的答案,或者一些關於為什麼我正在尋找的東西不可行的背景。

這個怎麼樣?

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

# Sort the results.
sort | \

# Only show unique lines.
uniq

(反斜杠需要用作這些行中的最後一個字元。)我不確定這種方法的可移植性,但它確實適用於 current bash

這有點愚蠢和低效,但它確實有效,而且它適用於|-first 風格。

# Add a comment to a pipeline, old-school BASIC-style
function REM {
 cat
}

cmd1 \
| REM "comment on cmd2" \
| cmd2 \
| REM "comment on cmd3" \
| cmd3

也就是說,如果我在生產程式碼中看到它,我可能會不高興並衝著寫它的人大喊大叫,所以使用,呃,要小心

更嚴重的是,{}塊呢?

cmd1 \
| {
 # comment on cmd2
 cmd2
} \
| {
 # comment on cmd3
 cmd3
}

引用自:https://unix.stackexchange.com/questions/26747