Введите EOF без перевода строки

1851
Sammitch

У меня есть небольшая команда, которую я использую для копирования / вставки файлов, которая включает в себя вставку 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 без дополнительного разрыва строки? Я имею в виду это все еще технически работаю, но я не хочу, ошибок, указанных при наличии не фактическая ошибка, и я не хочу, чтобы подавить поток ошибок в случае, если это фактическая ошибка.

1
Почему вы должны нажать `Enter` перед` Ctrl-D`? В моем тестировании это работало с двойным нажатием клавиши Ctrl-D. Daniel Beck 10 лет назад 4
Вы также можете использовать `base64 -d <<< aGVsbG8K` choroba 10 лет назад 0
@DanielBeck Я чувствую себя настолько глупым, что не знаю об этом. Sammitch 10 лет назад 0
@choroba Я все еще получил "неверный ввод" из этого Sammitch 10 лет назад 0
Какая ОС, какая base64 - версия? choroba 10 лет назад 0
Какую утилиту `base64` вы используете? GNU one игнорирует символы новой строки, и может быть сказано игнорировать другие не-base64 символы. rici 10 лет назад 0
@choroba: я считаю, что bash добавляет новую строку в конце слова, отправляемого на стандартный ввод `<<<` rici 10 лет назад 0

1 ответ на вопрос

0
rici

Я думаю, вы должны найти другую base64утилиту, такую ​​как версия GNU, которая допускает символы новой строки.

В противном случае, если предположить, что ввод имеет длину ровно одну строку (поскольку в противном случае в нем будет недопустимый символ новой строки), вы можете сделать следующее:

echo -n "$(head -n1)" | base64 -d 

или если вам не нравится echo -n(хотя это работает в вашей системе, это не гарантируется):

printf %s "$(head -n1)" | base64 -d 

Существует некоторая двусмысленность относительно того, являются ли переводы строк законными в кодировке base64; соответствующий RFC говорит, что они являются законными, только если приложение, использующее кодировку base64, задокументировано как разрешающее их. Это не очень помогает для кодека общего назначения base64.

Но AFAIK, практически все приложения, которые используют base64, явно разрешают переводы строки (а некоторые требуют их, устанавливая максимальную длину строки), поэтому мне кажется странным, что base64утилита не имеет какого-либо механизма, позволяющего им это делать.