pipe char в rot13-like команде translate разбивает слово в трубе
У меня есть сценарий, вдохновленный rotate13, в котором я хочу преобразовать строку ввода в заранее определенную, но, казалось бы, случайную строку вывода. Вот две команды, которые я хочу использовать для преобразования из читаемой строки в случайный вывод $pWCR
и бесплатная команда преобразования из (казалось бы) случайной строки в оригинальную читаемую строку $pWCO
,
pWCR=$(echo $origStr|tr 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\-_=+|\\[{]};:",./?<>' '>akHe)T[09Wo/L*}Em&YJP,\\"r;2pz_(6Usq+8u5d<RV#{iwclZtNGj?yIfn3bKFCh!X$ODQ=4\-%:]^BxM.Av@|g17S')
pWCO=$(echo $randStr|tr '>akHe)T[09Wo/L*}Em&YJP,\\"r;2pz_(6Usq+8u5d<RV#{iwclZtNGj?yIfn3bKFCh!X$ODQ=4\-%:]^BxM.Av@|g17S' 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\-_=+|\\[{]};:",./?<>')
Таким образом, проблема заключается в том, что строки, которые включают символ трубы |
включение в любую строку для перевода приводит к тому, что строка разделяется, фактически обрезается (а не разделяется) на символе канала, как будто она читается как логическое ИЛИ, я полагаю. Но так как он переведен внутри одинарных кавычек, я подумал, что буквального толкования символа не должно быть. Я пытался сбежать из трубы, но это не оказало заметного влияния.
Может кто-нибудь взвесить здесь и сообщить мне, где мои команды перевода идут не так. Я мог бы просто опустить символ канала, но мне хотелось бы знать, почему его следует опустить, если это так, предпочитая, конечно, сохранять его в пуле символов для перевода, чтобы пользователю не выдавался ненужный список символов которые недействительны. Одинарная кавычка, конечно, уже исключена из использования, но я хотел бы сохранить список исключенных символов для этого символа, если это возможно.
ОБНОВИТЬ:
@choroba: Хорошо, спасибо, что указали на то, что команда действительно работает на CLI, что заставляет меня более внимательно изучить код, обрабатывающий переменные $origStr
а также $randStr
,
Я использую yad
Форма текстовое поле, чтобы предложить пользователю для ввода своей строки для перевода. Я забыл до тщательного изучения yad
Команда, что он использует символ трубы '|' в качестве разделителя полей по умолчанию, и поэтому был виновником взлома входных строк с включенными символами канала.
userDets=$(yad --mouse --title"Restore random string to readable string" --image="$imgDPswd" " --form \
--field="Enter random string to restore its readable value: " '' \
--button="gtk-cancel:1" --button="gtk-ok:0") ; notSend "$LINENO" "userDets" "$userDets" "ty"
origStr=$(echo "$userDets"|sed -r 's/^([^|]*)\|.*$/\1/') ; notSend "$LINENO" "origStr" "$origStr" "ty"
После замены разделителя на пробел, вот так:
userDets=$(yad --mouse --title"Restore random string to readable string" --image="$imgDPswd" --separator=" " --form \
--field="Enter random string to restore its readable value: " '' \
--button="gtk-cancel:1" --button="gtk-ok:0") ; notSend "$LINENO" "userDets" "$userDets" "ty"
origStr=$(echo "$userDets"|sed -r 's/^([^ ]*) .*$/\1/') ; notSend "$LINENO" "origStr" "$origStr" "ty"
скрипт работает как нужно.
1 ответ
Единственная проблема, которую я вижу с этими двумя утверждениями, заключается в том, что $origStr и $randStr не заключены в двойные кавычки.
Это вызовет проблемы и может вызвать вашу проблему, но я не могу точно воспроизвести ваше описание.