某些命令(例如rsync
)将列表作为参数。这些文件可以包含 unix 注释吗#
?
答案1
除非该命令的文档明确提到它可以包含注释,否则假设它不能包含注释。
答案2
在这种情况下,我通常做的是构建一个参数数组(可以接受注释),然后将它们传递给 rsync 等。
#!/bin/bash
rsync_args=(
# Show me what you're doing
--itemize-changes
# All HTML and resources
*.html *.css *.js
# All PHP source code
*.php
# To the live server
live:
)
rsync "${rsync_args[@]}";
答案3
如果我理解正确的话,您想在文件列表中添加有关文件的注释。这是不可能的,因为当 shell 遇到 # 字符时,它将忽略命令行上所有剩余的字符。实现此目的的一种方法是将 rsync 与 --files-from=filelist 参数一起使用。文件列表文件可以包含注释。
另一方面,如果您想在文件名中嵌入 # 字符,那么这将起作用。例如,使用 bash:
touch a#b
touch 'a #b'
touch "a #b"
答案4
伊格纳西奥·巴斯克斯·艾布拉姆斯# comments
答案是最安全的,但如果你真的想这样做(就像我在某些情况下所做的那样),一个简单的解决方法可以轻松地通过处理占用整条线的问题 来至少部分实现。
如果您想处理真实列表数据行后面的注释,事情可能会变得有点棘手,除非您确定数据行不包含嵌入#
字符。
您可以使用流程替代和一个简单的帮助脚本。
这里有些例子。 beforegrc
生成diff
彩色输出。
我使用过 bash 函数,但您当然可以将它们保存到脚本文件中。
# nocom handles comment-only lines (ie. no dat)
# it ignores any # chars embedded in your data lines.
#
nocom() { sed -e '/^[[:space:]]*#/d' "$1"; }
# NOCOM handles handles comments which occurr after your data
# as well as comment-only lines.
# Do not use NOCM unless you are CERTAIN that your data
# lines contain no # chars.
#
NOCOM() { sed -n '/^[[:space:]]*#/d; s/^\([^#][^#]*[^[:space:]]\)[[:space:]]*#.*/\1/; p' "$1"; }
printf '# a bit of hokus-pokus
# you see the coments here,
# but the calling program will not.
$HOME/bin/abra
$HOME/bin/kadabra # comment after data
$HOME/bin/sim# another comment after data
' >file
echo == nocom ==
cat <(nocom "file")
echo == NOCOM ==
cat <(NOCOM "file")
echo == diff ==
grc diff "file" <(NOCOM "file")
这是输出:
== nocom ==
$HOME/bin/abra
$HOME/bin/kadabra # comment after data
$HOME/bin/sim# another comment after data
== NOCOM ==
$HOME/bin/abra
$HOME/bin/kadabra
$HOME/bin/sim
== diff ==
1,3d0
< # a bit of hokus-pokus
< # you see the coments here,
< # but the calling program won't.
5,6c2,3
< $HOME/bin/kadabra # comment after data
< $HOME/bin/sim# another comment after data
---
> $HOME/bin/kadabra
> $HOME/bin/sim