Здесь -документы в Bash и dash не поддерживают это. Вы не можете хранить нуль в переменной, они удалены из подстановок команд, вы не можете написать их буквально, и вы не можете использовать ANSI -C кавычки внутри документа здесь -. Ни одна из оболочек не является нулевой -дружественной, и они обычно обрабатываются как (C -ограничители строк )в стиле C ), если кто-то входит.
У вас есть несколько вариантов::использовать реальный файл , использовать zsh, использовать подстановку процесса или использовать стандартный ввод.
Вы можете делать именно то, что хотите, в zsh, который гораздо более -дружественн к нулю.
zsh% null=$(printf '\x00')
zsh% hexdump -C < a${null}b${null}
heredoc> EOT
00000000 61 00 62 00 0a |a.b..|
00000005
Заметьте, однако, что heredocs имеют неявную завершающую новую строку, что может быть нежелательно (это будет дополнительное поле для shuf
после конечного нуля ).
Для Bash вы можете использовать замену процесса почти эквивалентно вашему heredoc в сочетании с printf
или echo -e
для создания встроенных нулей:
bash$ hexdump -C < <(
printf 'item 1\x00item\n2\x00'
)
00000000 69 74 65 6d 20 31 00 69 74 65 6d 0a 32 00 |item 1.item.2.|
0000000e
Это не обязательно полностью эквивалентно здешнему -документу, потому что он часто тайно помещается в настоящие файлы оболочкой (, что важно для возможности поиска, среди прочего ).
Поскольку вы, вероятно, хотите подавить завершающие символы новой строки, вы даже не можете использовать heredoc внутри команд -он должен быть printf
/ echo -ne
, если это безопасно для получения точного -детального контроля над выход.
Вы не можете выполнять подстановку процессов в dash, но в любой оболочке вы можете передать стандартный ввод из подоболочки:
dash$ (
printf 'item 1\x00'
printf 'item\n2\x00'
) | hexdump -C
00000000 69 74 65 6d 20 31 00 69 74 65 6d 0a 32 00 |item 1.item.2.|
0000000e
shuf
с удовольствием читает из стандартного ввода по умолчанию, так что это должно работать для вашего конкретного варианта использования, насколько я понимаю. Если у вас есть более сложная команда,нахождение на правой -стороне конвейера может привести к некоторым путаницам с областью видимости.
Наконец, вы можете записать свои данные в реальный файл, используя printf
и использовать его вместо здесь -документа. Этот вариант был описан в другом ответе . Вам нужно будет убедиться, что вы очистили файл после этого, и, возможно, захотите использоватьmktemp
или аналогичный, если он доступен, для создания безопасного имени файла, если есть какие-либо проблемы с безопасностью в реальном времени.
sudo -l говорит вам, что вам предоставлено. чтобы вы могли запустить это на всех серверах и всех пользователях. Удачи с этим ;-)
но я думаю, вы должны спросить, зачем мне такой отчет? У нас была похожая проблема, и когда мы объединили несколько файлов sudo в один, проблема исчезла