我在 bash 中有以下代码,我想知道是否可以摆脱\+
并简单地使用+
find "$fdir" \
-type f -name "*.org" -o -name "*.texi" \
-exec head -n "$n" {} \+ \
| grep --color -e ^ -e '^==>.*'
答案1
+
是不是任何 shell 中的特殊字符,不需要引号。
^
尽管包括 Thompson shell(第一个 UNIX shell)、Bourne shell、fish
、rc
、es
、zsh
以及extendedglob
.{}
rc
需要在, 和旧版本中引用 fish
。*
, (
, )
,>
在大多数 shell 中都是特殊的。
请注意,并非所有head
实现都接受多个参数。 GNU 实现head
会打印这些==>
标题行,但仅当传递多个参数或使用该-v
选项时。
另请注意,AND(隐含)优先于 OR ( -o
) find
(请参阅具有多个“-name”和“-exec”的“find”仅执行“-name”的最后匹配项), 所以:
find "$fdir" \
-type f '(' -name '*.org' -o -name '*.texi' ')' \
-exec head -v -n "$n" '{}' + \
| grep --color -e '^' -e '^==>.*'
(使用'...'
引用代替"..."
或\
引用只是为了保持一致性)。
可以在类似 Bourne、类似 csh 的 shell 和fish
.在rc
/中es
,您需要删除双引号。在 csh/tcsh 中,您可以替换"$fdir"
为,$fdir:q
因此即使$fdir
包含换行符它也可以工作。
$fdir
和周围的引号$n
仅在类 Bourne 的 shell 中需要,而不是zsh
在类 csh 的 shell 中。"
不是rc
/中的引用运算符es
。两者\
都不是引用运算符rc
(尽管确实像在其他 shell 中一样进行行延续)。
看如何在 Unix shell 中像普通字符一样使用特殊字符?哪些字符在哪个 shell 中是特殊的以及如何转义/引用它们。