【问题标题】:Got "sort: /dev/fd/63: end of file" when sorting files排序文件时出现“sort: /dev/fd/63: end of file”
【发布时间】:2018-04-11 12:19:57
【问题描述】:

我在网上搜索并使用以下 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) 的另一个容器中,它似乎对我来说很好用

【问题讨论】:

    标签: bash pipe


    【解决方案1】:

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

    ./test.sh <seed>
    

    当您的脚本执行&lt;(get_seeded_random $1) 时,文件描述符/dev/fd/63 用于将您的get_seeded_random() 函数的输出提供给sort。因为函数没有这个种子,dev/fd/63 是空的。

    【讨论】:

    • 嗨 gui.co,我忘了把种子放在问题中。实际上我确实使用了种子,例如 ./test.sh 405 并且我得到了同样的错误。并且相同的脚本在 bash 版本 4.1.2(1)-release (x86_64-redhat-linux-gnu) 的另一个环境中工作
    • 从你的两个cmets中说的,你的机器上似乎没有安装openssl。这就是为什么你会得到这个/dev/fd/63: end of file 错误。尝试安装它并重做您的命令或 oliv 的。
    【解决方案2】:

    您的脚本至少有 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 *
    

    【讨论】:

    • 嗨,奥利夫,我想要一个随机排序,但保持种子固定,这样结果就不会改变。我在原始问题中对此进行了修改。另外,我试过你的代码,得到以下错误 openssl: command not found sort: /dev/fd/63: end of file
    【解决方案3】:

    参考Shuffle output of find with fixed seed

    --random-source 需要比42 或这么小的字符串有更多的字节。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多