Назад | Перейти на главную страницу

Почему эта команда bash иногда возвращает пустую строку?

У меня есть следующая строка для генерации случайного числа:

head -c 3 / dev / urandom | hexdump | sed -e 's / [0 a-z] // g' | голова -c 1

Это работает нормально, но иногда (очень редко) возвращает новую строку. Кто-нибудь знает, почему это может быть?

Короткий ответ: Ваши три случайных байта соответствуют [0a-f] + в шестнадцатеричном формате.

Длинный ответ: В hexdump команда в вашем канале возвращает смещение адреса, за которым следует пробел и шестнадцатеричное представление трех байтов, которые вы получаете от head -c 3 /dev/urandom. Смещение адреса в первой строке всегда "0000000", поэтому оно отбрасывается sed фильтр, а также пространство после него. Итак, единственное, что имеет отношение к делу, sed команда в первой строке - шестнадцатеричное представление трех urandom байты. Но бывает (случайно ;-)), что шестнадцатеричное представление всех трех байтов будет состоять из числа 0 и символов a через f, только. Так что ваши sed filter ничего не вернет для первой строки, оставив только одну новую строку. В head -c 1 в конце трубы отфильтрует следующую строку из hexdump, так что вы ничего не увидите.

Пример с не очень случайными числами:

# First three bytes with values 4, 5 and 6 octal.
$ echo -n $'\004\005\006' | hexdump 
0000000 0504 0006
0000004

# Because of little endianess, we get the 5 back after the sed and head filters
$ echo -n $'\004\005\006' | hexdump | sed -e 's/[0 a-z]//g' | head -c 1
5

# Now with FF bytes (be aware that it is octal notation), 
# only 'f' and '0' and space are left:
$ echo -n $'\377\377\377' | hexdump 
0000000 ffff 00ff
0000004

# Now filtering this through sed gives nothing back
$ echo -n $'\377\377\377' | hexdump | sed -e 's/[0 a-z]//g' | head -c 1
$

Вы должны использовать $RANDOM, как написал @Iain.

Понятия не имею, почему ваша команда генерирует новую строку, но она кажется очень запутанной. Вы пробовали работать со встроенным bash $RANDOM ?

echo $(( $RANDOM % 9 ))

например.

Есть также много явно менее запутанных способов сделать это. Вот о переполнении стека.