我已在线搜索并使用以下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)
答案 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指向输入文件本身,因此,如果您想复制实验(如我的情况),则将相同的输入以相同的方式改组