Конечно, давайте посмотрим, из скольких направлений мы можем взглянуть на этого слона? вещь.
Фактический системный вызов в вашей собранной программе - это машинная инструкция, которая запускает повышение привилегий в режиме ядра, а в самом ядре - это код, который вызывает инструкция. Код libc (и среда исполнения каждого языка) устанавливает машинные регистры и параметры в памяти там, где код ядра ожидает их найти, которые могут быть явно странными из-за ограничений на эту машинную инструкцию.
Попав в код самой ОС, происходит немного зеркального разворачивания машинно-зависимых вещей, которые выполняла среда выполнения, а затем совершенно обычный вызов подпрограммы.
Если вы хотите точно увидеть, как это работает в полнофункциональной ОС, загрузите исходный код ядра ( git clone https://git.kernel.org/cgit/linux/kernel/ git / torvalds / linux.git /
) и сделайте, например, git grep -i system \ call
. Вытащите исходный код glibc и сделайте то же самое.
Это работает следующим образом:
SET1->.............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
Итак, tr
переведет SET1
в SET2
.
Это эквивалентно первому, потому что также смещается на 13
единиц, так как там 13 точек.
Чтобы включить строчные буквы, вам нужно расположить их в SET1
с аналогичным смещением, т.е.:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
Это 26 точек между Z
и a
, охватывающих половину верхнего -регистра и половину нижнего -регистра алфавита. Таким образом, сама команда tr
будет:
tr.............A-Z..........................a-z A-ZA-Za-za-z
Как говорит @Prvt _Yadv в своем ответе, это работает, потому что есть 13 точек.
Наборы
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
Точка не является специальным символом, поэтому, если у вас есть точка во вводе, она тоже будет переведена. В имеющейся у меня версии tr
это последний соответствующий символ во втором наборе, в данном случае этоM
:
$ echo URYC ZR CYRNFR. | tr.............A-Z A-ZA-Z
HELP ME PLEASEM
(Я мог предположить, что другая версия tr
могла бы использовать первый совпадающий символ в наборе 2, что дало бы A
.)
Чтобы ответить на ваш второй вопрос , вам нужно еще 13 точек в первом наборе, чтобы «израсходовать» оставшиеся прописные буквы во втором наборе:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
затем вы можете повторить шаблон:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
, что дает нам:
tr.............A-Z..........................a-z A-ZA-Za-za-z
Итак,:
$ echo Uryc zr cyrnfr | tr.............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Лично я думаю, что первый способ сделать это в вашем вопросе проще!
Первый способ также не преобразует никакие другие символы во входных данных. Например, сравните:
$ echo Uryc zr cyrnfr. | tr.............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
с
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.