相关疑难解决方法(0)

为什么使用 shell 循环处理文本被认为是不好的做法?

在 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一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现?

我试图了解 Linux 上特殊文件的概念。然而,/dev根据我的知识,当它的功能可以通过 C 中的几行代码实现时,在其中包含一个特殊文件似乎很愚蠢。

此外,您可以以几乎相同的方式使用它,即通过管道进入null而不是重定向到/dev/null. 将其作为文件是否有特定原因?使它成为一个文件不会导致许多其他问题,例如太多程序访问同一文件吗?

executable devices files null

116
推荐指数
6
解决办法
2万
查看次数

我应该关心不必要的猫吗?

许多命令行实用程序可以从管道或文件名参数中获取输入。对于长 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)

后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否每秒运行一次?可读性的差异并不大。

performance pipe shell-script cat

56
推荐指数
4
解决办法
6748
查看次数

如何从 shell 脚本安全地创建和访问临时文件?

我读过将输出重定向到固定名称文件/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 ]据我所知,等价物不支持文件通配。

因此,我的问题是双重的:

  1. 如何安全地创建临时文件?是"predictablename.$RANDOM"可接受的做法还是有更好(更安全、更简单)的方法?
  2. 如何通过检查 轻松访问文件和/或确定其存在predictablename

shell-script tmp caching

17
推荐指数
2
解决办法
8428
查看次数