在Bash中如何注释一个长的管道命令

11
我发现在bash脚本中创建长管道非常强大,但我认为主要缺点是似乎没有办法插入注释。
例如,有没有好的方法向这个脚本添加注释?
#find all my VNC sessions
ls -t $HOME/.vnc/*.pid                  \
    | xargs -n1                         \
    | sed 's|\.pid$||; s|^.*\.vnc/||g'  \
    | xargs -P50 --replace vncconfig -display {} -get desktop \
    | grep "($USER)"                    \
    | awk '{print $1}'                  \
    | xargs -n1 xdpyinfo -display       \
    | egrep "^name|dimensions|depths"

1
这并不回答你的问题,但我肯定你可以至少删除其中的3个管道符。不幸的是,我似乎没有vncconfig,所以我无法测试它。 - SiegeX
@bukzor 如果您提供xargs调用vncconfig的输入和输出,我会很高兴地为您翻译。不过,一般来说,每当您看到一个grep后面跟着一个awk时,您都可以将它们合并。在您的情况下,可以使用awk -v user=$USER '$0 ~ user{print $1}' - SiegeX
@SiegeX:我已经移除了我的非标准工具,所以现在你应该能够运行它了。它只是为不存在的会话提供了一个超时时间。输入是X显示名称,输出相同,但带有用户名称在括号中,例如:myhost:2.0(mylogin)。 - bukzor
@bukzor 看看我的回答。正如我所提到的,我仍然不知道是否有 vncconfig,所以我还是得猜测。 - SiegeX
我在一月份在superuser上回答了这个问题:http://superuser.com/questions/238791/comments-in-a-multi-line-bash-command/238797#238797 - Mikel
4个回答

27

让管道符成为每行的最后一个字符,并使用 # 替代 \,像这样:

ls -t $HOME/.vnc/*.pid | #comment here
   xargs -n1 | #another comment 
   ...

3
请注意,如果管道中的每个步骤都在管道之后,那么你就不需要(大部分)可怕且多余的反斜杠,它们看起来像从海贝脚本中爬出来的。 - Jonathan Leffler

9

1
除非它们是“惊人地”长的管道,否则您不必进行行内注释,只需在顶部进行注释:
# Find all my VNC sessions.
#   xargs does something.
#   sed does something else
#   the second xargs destroys the universe.
#   :
#   and so on.

ls -t $HOME/.vnc/*.pid                  \
    | xargs -n1                         \
    | sed 's|\.pid$||; s|^.*\.vnc/||g'  \
    | xargs -P50 --replace /opt/tools/bin/restrict_resources -T1 \
            -- vncconfig -display {} -get desktop 2>/dev/null \
    | grep "($USER)"                    \
    | awk '{print $1}'                  \
    | xargs -n1 xdpyinfo -display       \
    | egrep "^name|dimensions|depths"

只要注释是相对局部化的,那就没问题。所以我不会把它们放在文件顶部(除非你的管道是文件中的第一件事),或者在厕纸上乱涂乱画然后锁在你的办公桌里。
但是当我查看一个块时,我首先要查找紧接在块前面的注释。即使在 C 代码中,我也不会注释每一行,因为注释的目的主要是显示“为什么”和高级“如何”。

0
#!/bin/bash

for pid in $HOME/.vnc/*.pid; do
    tmp=${pid##*/}
    disp=${tmp%.*}
    xdpyinfo -display "$disp" | # commment here
    egrep "^name|dimensions|depths"
done

我不明白为什么需要使用 vncconfig,因为它所做的只是附加“(user)”,而你随后会在调用 xdpyinfo 时将其删除。此外,所有这些管道都需要相当大的开销,如果你使用 time 命令比较你的脚本和我的脚本,我认为你会发现性能相当甚至更快。


重点是要仔细检查VNC会话是否真的属于我。经常发生机器崩溃,杀死我的VNC,另一个用户弹出并获得曾经属于我的显示。串行执行时性能较慢,而xargs提供了并行化(-P50)。许多查询不返回并在30秒后超时。 - bukzor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接