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 не заключены в двойные кавычки.

Это вызовет проблемы и может вызвать вашу проблему, но я не могу точно воспроизвести ваше описание.

Другие вопросы по тегам