Введите EOF без перевода строки
У меня есть небольшая команда, которую я использую для копирования / вставки файлов, которая включает в себя вставку tar-архива в кодировке base64 в stdin, но утилита base64 продолжает выдавать мне сообщение об ошибке ввода, потому что мне приходится вводить разрыв строки перед выдачей EOF, чтобы остановить ввод.
например:
[root@box ~]echo hello | base64
aGVsbG8K
[root@box ~]base64 -d
aGVsbG8K[enter][ctrl+d]
hello
base64: invalid input
В отличие от более грубых:
[root@box ~]echo -n 'aGVsbG8K' | base64 -d
hello
Что не очень хорошо работает в контексте написанной мной команды.
Так есть ли способ вставить EOF без дополнительного разрыва строки? Я имею в виду, что это все еще технически работает, но я не хочу, чтобы ошибки указывались, когда нет фактической ошибки, и я не хочу подавлять stderr в случае реальной ошибки.
1 ответ
Я думаю, вы должны найти другое base64
Утилита, такая как версия GNU, которая допускает символы новой строки.
В противном случае, если предположить, что длина ввода ровно одна строка (так как в противном случае в нем будет недопустимый символ новой строки), вы можете сделать следующее:
echo -n "$(head -n1)" | base64 -d
или если вам не нравится echo -n
(хотя, похоже, это работает в вашей системе, это не гарантируется):
printf %s "$(head -n1)" | base64 -d
Существует некоторая неоднозначность относительно того, являются ли переводы строк законными в кодировке base64; соответствующий RFC говорит, что они являются законными, только если приложение, использующее кодировку base64, задокументировано как разрешающее их. Это не очень помогает для кодека общего назначения base64.
Но AFAIK, практически все приложения, которые используют base64, явно разрешают переводы строки (а некоторые требуют их, устанавливая максимальную длину строки), поэтому мне кажется странным, что base64
У утилиты не было бы какого-то механизма, позволяющего им это делать.