bash脚本的奇怪行为

Vla*_*tch 14 bash

这是一个片段:

var=`ls | shuf | head -2 | xargs cat | sed -e 's/\(.\)/\1\n/g' | shuf | tr -d '\n'`
Run Code Online (Sandbox Code Playgroud)

这将从当前目录中选择两个随机文件,组合它们的内容,将它们混洗,并将结果分配给var.这大部分时间都可以正常工作,但是在一千个案例中只有一次,而只是输出ls被绑定到var(它不仅仅是输出,参见编辑II).可能是什么解释?

一些更可能相关的事实:

  • 该目录至少包含两个文件
  • 目录中只有文本文件
  • 文件名不包含空格
  • 文件长度从5到大约1000个字符
  • 该代码段是一个较大的脚本的一部分,它并行运行两个实例
  • bash版本: GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
  • UNAME: Linux 2.6.35-28-generic-pae #50-Ubuntu

编辑:我自己运行了几千次没有错误的代码片段.然后我尝试用整个脚本的其他各个部分运行它.这是一个产生错误的配置:

cd dir_with_text_files
var=`ls | shuf | head -2 | xargs cat | sed -e 's/\(.\)/\1\n/g' | shuf | tr -d '\n'`
cd ..
Run Code Online (Sandbox Code Playgroud)

cds 之间有几百行脚本,但这是重现错误的最小配置.请注意,异常输出绑定到var当前目录的输出,而不是dir_with_text_files.

编辑II:我一直在更详细地研究输出.该ls输出不会单独出现,它有两个洗牌文件(它们的内容之间,或之后或之前,完整的)一起的.但它变得更好; 让我建立一个讨论特定目录的舞台.

[~/projects/upload] ls -1
checked // dir
lines   // dir, the files to shuffle are here
pages   // also dir
proxycheck
singlepost
uploader
indexrefresh
t
tester
Run Code Online (Sandbox Code Playgroud)

到目前为止,我见过的输出ls从跑upload,但现在我看到的输出ls */*(也跑了upload).它的形式是"someMangledText lsmoreMangledText ls */*finalBatchOfText".ls毫无疑问,生成的序列是否可能以某种方式执行?

Rob*_*ley 0

根据您所说的失败率,并考虑到上面海报所执行的其他测试的成功,这听起来像是一个可能由偶尔的目录更改失败引起的问题。您在此脚本中访问的目录是偶然从远程计算机安装的吗?如果是这样,这可能只是一个与网络相关的小型临时故障,未得到正确处理。(只是猜测。)