排序文件时得到“sort:/ dev / fd / 63:文件结尾”

时间:2018-04-11 12:19:57

标签: bash pipe

我已在线搜索并使用以下bash脚本(test.sh)从已分配随机种子的目录中对文件进行排序:

#!/bin/bash
get_seeded_random()
{
  seed="$1"
  openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
    </dev/zero 2>/dev/null
}

ls |sort -R --random-source=<(get_seeded_random $1) 

当我跑步时:

./test.sh 405

我得到了:

sort: /dev/fd/63: end of file

我正在使用的bash --version是 GNU bash,版本4.2.46(2)-release(x86_64-redhat-linux-gnu)

有人可以帮助我吗?它似乎在另一个容器中工作正常,其中bash --version是GNU bash,版本4.1.2(1)-release(x86_64-redhat-linux-gnu)

3 个答案:

答案 0 :(得分:0)

据我了解,您的函数正在寻找一个种子,您应该将其作为参数传递给test.sh脚本($ 1)

./test.sh <seed>

当您的脚本执行<(get_seeded_random $1)时,文件描述符/dev/fd/63用于将get_seeded_random()函数的输出提供给sort。由于该函数没有此种子,dev/fd/63为空。

答案 1 :(得分:0)

您的脚本至少有2个问题。

  • /dev/zero作为openssl的输入文件并不是一个好主意,因为它具有无限长度
  • $seed为空,导致openssl密码为空

您可以通过类似

的方式解决这两个问题
sort -R --random-source=<(dd if=/dev/zero count=1 | openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt)

并让您使用./test "mysecretpassword"

调用您的脚本

但请不要!这是获取随机文件夹条目的一种非常难看的方式。

如果您的唯一目标是以随机顺序包含文件夹的文件,请使用shuf命令:

shuf -e *

答案 2 :(得分:0)

引用Shuffle output of find with fixed seed

--random-source的字节数必须大于42或这么小的字符串。


建议:将--random-source指向输入文件本身,因此,如果您想复制实验(如我的情况),则将相同的输入以相同的方式改组