Получил "sort: / dev / fd / 63: end of file" при сортировке файлов

Я поискал в Интернете и использовал следующий сценарий 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
478
3

Ответы 3

Насколько я понял, ваша функция ищет семя, которое вы должны передать в качестве аргумента вашему скрипту test.sh ($ 1)

./test.sh <seed>

Когда ваш сценарий выполняет <(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)

Min Chen 12.04.2018 14:54

Из того, что вы сказали в своих двух комментариях, похоже, что openssl не установлен на вашем компьютере. Вот почему вы получаете эту ошибку /dev/fd/63: end of file. Попробуйте установить его и повторить либо свою команду, либо команду oliv.

gui.co 13.04.2018 14:00

У вашего скрипта как минимум 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

Min Chen 12.04.2018 14:38

Ссылаясь на Перемешать вывод find с фиксированным начальным числом

--random-source должен иметь больше байтов, чем 42 или такая маленькая строка.


Предложение: укажите --random-source на сам входной файл, чтобы тот же ввод перетасовывался таким же образом, если вы заботитесь о воспроизведении экспериментов (как в моем случае)

Другие вопросы по теме