在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?
正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念、可靠性、易读性、性能和安全性。
这个答案解释了可靠性和易读性方面:
while IFS= read -r line <&3; do
printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)
为了性能,从文件或管道读取时,while
循环和读取非常慢,因为内置的read shell一次读取一个字符。
怎么样的概念和安全性方面?
我试图了解 Linux 上特殊文件的概念。然而,/dev
根据我的知识,当它的功能可以通过 C 中的几行代码实现时,在其中包含一个特殊文件似乎很愚蠢。
此外,您可以以几乎相同的方式使用它,即通过管道进入null
而不是重定向到/dev/null
. 将其作为文件是否有特定原因?使它成为一个文件不会导致许多其他问题,例如太多程序访问同一文件吗?
许多命令行实用程序可以从管道或文件名参数中获取输入。对于长 shell 脚本,我发现以 a 开头的链cat
使其更具可读性,尤其是在第一个命令需要多行参数的情况下。
相比
sed s/bla/blaha/ data \
| grep blah \
| grep -n babla
Run Code Online (Sandbox Code Playgroud)
和
cat data \
| sed s/bla/blaha/ \
| grep blah \
| grep -n babla
Run Code Online (Sandbox Code Playgroud)
后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否每秒运行一次?可读性的差异并不大。
我读过将输出重定向到固定名称文件/tmp
可能存在安全风险,因为如果攻击者(或不满者)注意到/tmp/tmpfileformyscript.tmp
我运行脚本时创建了一个文件(即使他没有对我的脚本的读取访问权限)脚本),例如,他可以创建一个符号链接ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmp
,.bashrc
当我运行我的脚本时,它会导致我破坏我的文件。
因此,我可以使用类似filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"
.
但是,有时我想使用 tmp 文件进行缓存,在这种情况下,我想知道“tmpfile.tmp.*”是否与其中的任何内容匹配/tmp
,如果匹配,请使用该文件而不是创建一个新文件。不幸的是test
,[ -f filename ]
据我所知,等价物不支持文件通配。
因此,我的问题是双重的:
"predictablename.$RANDOM"
可接受的做法还是有更好(更安全、更简单)的方法?predictablename
?shell-script ×2
caching ×1
cat ×1
devices ×1
executable ×1
files ×1
null ×1
performance ×1
pipe ×1
shell ×1
tmp ×1