Как я могу напечатать '@' в оболочке Linux?

OpenSSL — это прежде всего библиотека,:набор подпрограмм, которые могут использовать программы. На самом деле это две объединенные библиотеки :/usr/lib/libcrypto.so.1.1, которая содержит подпрограммы, связанные с криптографическими примитивами и управлением сертификатами, и /usr/lib/libssl.so.1.1, которая содержит подпрограммы, связанные с протоколом TLS. Часть 1.1в имени файла является частью версии библиотеки, и каталог, содержащий эти файлы, может отличаться (, например, в Ubuntu для 64-битного -ПК это/usr/lib/x86_64-linux-gnu). Эти библиотеки входят в состав пакета libssl1.1в Debian/Ubuntu и производных дистрибутивах (, опять же, 1.1является соответствующей частью номера версии ).

OpenSSL также поставляется с инструментом командной строки -/usr/bin/openssl, который предоставляет интерфейс командной строки для функций из библиотек libcryptoи libssl. Его можно использовать для эталонного тестирования криптографических примитивов, манипулирования ключами и сертификатами, запуска некоторых тестов и т. д. Его можно использовать даже для таких вещей, как шифрование данных, но интерфейс совсем не приспособлен к реальному -использованию в мире :это слишком низкий -уровень, и большинство способов его использования небезопасны. Инструмент командной строки входит в состав пакета openssl.

Причина, по которой пакет библиотеки отделен от пакета, содержащего программу командной строки, по той же причине, по которой пакет библиотеки содержит часть номера версии, а файлы библиотеки также содержат ее. Можно установить несколько версий библиотеки, и вам необходимо это сделать, если у вас есть программы, созданные для разных версий ABI библиотеки. С другой стороны, вы можете установить только одну команду openssl.

1.1.0j и 1.1.0k — это две разные версии OpenSSL, которые достаточно близки, чтобы иметь совместимые ABI. Как правило, когда версия программы представлена ​​в виде чисел с точками между ними, приращение числа влево представляет собой серьезное изменение.в то время как увеличение числа справа представляет очень незначительное изменение, такое как исправление ошибки. OpenSSL имеет тенденцию вносить существенные изменения с увеличением самой правой цифры или даже буквы, что несколько необычно.

Обычно у вас будет одна и та же версия инструмента командной строки и библиотеки, а также, возможно, некоторые устаревшие версии библиотек для программ, созданных с помощью более старого ABI. Например, Ubuntu 18.04 поставляет OpenSSL 1.1.1, но также предоставляет libssl1.0.0, содержащий версию 1.0.2 библиотек для программ, созданных с ABI 1.0.0, с которым 1.0.2 остается совместимым. В системе с датой от -до -программа opensslвсегда относится к той же версии, что и библиотека, которую она использует, поскольку обе они происходят из одного исходного пакета. Но в системе, которая не соответствует дате -до -, вы, возможно, уже обновили библиотеку до 1.1.0k, но все еще имеете более старую версию исполняемого файла командной строки 1.1.0j.

0
19.08.2021, 14:35
7 ответов

С оболочкой bash:

echo $'\x40'

С оболочкой POSIX:

printf '\100'
41
20.08.2021, 10:26

Если установлены варианты GNU sedи cut, вы можете извлечь символ @из адреса сообщения об ошибке, отображаемого вsed --version:

sed --version |grep bug-sed|cut -d : -f2|cut -d d -f2|cut -d g -f1
5
20.08.2021, 10:26

Решено!

Я использовал man ifconfigи прокрутил до конца. Я нашел адрес электронной почты, откуда я могу скопировать@

2
20.08.2021, 10:26

Если у вас есть Perl, вы можете получить все печатные символы ASCII с минимальной потребностью в специальных символах, подобных этому (работает и с двойными -кавычками):

shell$ perl -l -e 'print map chr, 32..126'
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

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

shell$ perl
print chr for 32..126
^D
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~shell$
4
20.08.2021, 10:26

Вы можете использовать man asciiдля отображения набора символов ASCII и вырезать -и -вставить из этого вывода.

(Если у вас установлена ​​программа asciiиз Plan 9 или что-то еще, вы можете явно указать, что вам нужна справочная страница из раздела 7 :man 7 ascii, но обычно в этом нет необходимости.)

32
20.08.2021, 10:26

Существует много способов напечатать символ с возрастающей сложностью:

printf '\100'              # most basic solution for all POSIX shells.
printf '\x40'              # bash, ksh, zsh (and many other shells).
echo -e '\u40'             # bash 4.2+
echo $'\x40'               # bash 2.0+
echo 40 | xxd -p -r
perl -le 'printf("%s",chr) for 32..126'      # list ascii
perl -le 'print map chr, 32..126'            # list ascii

И его можно было найти непосредственно в man ascii, а в man edв Linux (очень короткую справочную страницу для очень распространенной утилиты ).

-2
20.08.2021, 10:26

Это некоторые методы, которые ранее не упоминались:

printf  '\x40'
printf  '\u40'
echo -e '\u40'
echo   $'\u40'
echo 40 | xxd -p -r
perl -le 'print chr 64'
python <<<'print chr(64)'
python3 -c 'print(chr(64))'
php -r 'echo chr(64);'

[1] Значение 40— это шестнадцатеричное значение символа ASCII @. Или 64в десятичном формате (, используемом позже ). Это выражается в \x40или читается как шестнадцатеричное(\x)значение 40. Команда printf преобразует его в байт такого значения, и консоль выводит @.

И это также значение кодовой точки Unicode того же символа @. Так получилось, что кодовые точки Unicode и значения символов ASCII полностью совпадают (по дизайну )до 127 (шестнадцатеричных 7Fили восьмеричных177).

Однако между\x40(или\100\u40есть разница. Последний всегда будет создавать кодовую точку UNICODE, независимо от того, какая локаль, язык или условие установлены для ОС или компьютера, на котором выполняется код. В то время как printf '\100'выводит пробел. И также по задумке кодовые точки в UNICODE были назначены как статические значения. Ожидается, что они не изменятся в будущем. Короче говоря, \u40должен производить @даже в системе на основе EBCDIC -(, например ). Для значений ASCII, которые могут показаться небольшим выигрышем,но для символов с более высокими кодовыми точками это реальное преимущество, поскольку \u2225всегда должно даватьparallel()независимо от используемой локали или языка.

Поддержка \uxxxxбыла впервые добавлена ​​в GNU printf (, автономную утилиту )в 2000 году. Затем в zsh print/printf/echo/$'...' в 2003 году и несколько других оболочек позже. Синтаксис $'\uxxxx' даже планируется включить в POSIX. Вам нужны 4 цифры в автономном printf:printf '\u0040'. В bash, ksh93 и zsh допускается от 1 до 4 цифр. \Uxxxxxxxxтребуется для использования до 8 шестнадцатеричных цифр.

[1] Первоначальная идея из (ныне стертого )комментария Стефана Шазела

4
25.08.2021, 11:51

Теги

Похожие вопросы