相关疑难解决方法(0)

Shell脚本读取最后一行丢失

我有一个... bash shell脚本的奇怪问题,我希望得到一些见解.

我的团队正在编写一个脚本,该脚本遍历文件中的行并检查每个行中的内容.我们有一个错误,当通过将不同脚本排序在一起的自动化过程运行时,最后一行没有被看到.

使用的代码遍历文件中的行(名称存储在DATAFILE

cat "$DATAFILE" | while read line 
Run Code Online (Sandbox Code Playgroud)

我们可以从命令行运行脚本,它会看到文件中的每一行,包括最后一行,就好了.但是,当由自动化进程(运行在相关脚本之前生成DATAFILE的脚本)运行时,永远不会看到最后一行.

我们更新了代码以使用以下代码迭代这些行,并清除了问题:

for line in `cat "$DATAFILE"` 
Run Code Online (Sandbox Code Playgroud)

注意:DATAFILE没有在文件末尾写入换行符.

我的问题是两部分......为什么最后一行不会被原始代码看到,为什么这会改变有所作为呢?

我只想到我能想出为什么最后一行不会被看到:

  • 前一个写入文件的进程依赖于进程结束以关闭文件描述符.
  • 问题脚本启动并在之前足够快地打开文件,而前一个进程已经"结束",它没有"关闭/清理"足以让系统自动关闭文件描述符.

话虽这么说,似乎,如果你在shell脚本中有2个命令,那么第一个应该在脚本运行第二个时完全关闭.

对问题的任何见解,尤其是第一个,都将非常感激.

bash process

58
推荐指数
3
解决办法
4万
查看次数

使用shell脚本中的read命令逐行读取输入文件会跳过最后一行

我通常使用read命令逐行读取shell脚本的输入文件.如果未在输入文件blah.txt中的最后一行末尾插入新行,则下面的示例代码会产生错误的结果.

#!/bin/sh

while read line
do
echo $line
done <blah.txt
Run Code Online (Sandbox Code Playgroud)

因此,如果输入文件读取类似于 -

One 
Two
Three
Four
Run Code Online (Sandbox Code Playgroud)

我四点后没有回复,脚本无法读取最后一行,并打印出来

One
Two
Three
Run Code Online (Sandbox Code Playgroud)

现在,如果我在四个之后留下一个额外的空白行,比如,

One 
Two
Three
Four
//blank line
Run Code Online (Sandbox Code Playgroud)

输出打印所有行,包括四行.但是,当我使用cat命令读取一行时,情况并非如此; 包括最后一行在内的所有行都打印出来,而不必在末尾添加额外的空白行.

有人知道为什么会这样吗?我创建的脚本主要由其他人运行,因此没有必要在每个输入文件的末尾添加额外的空行.

我一直试图解决这个问题; 如果你有任何解决方案我会很感激(当然,cat命令是一个,但我想知道阅读不起作用的原因).

bash shell file-io parsing

20
推荐指数
3
解决办法
11万
查看次数

标签 统计

bash ×2

file-io ×1

parsing ×1

process ×1

shell ×1