>>>>> Artem Chuprina <r...@lasgalen.net> writes:
>>>>> Ivan Shmakov -> debian-russian@ @ Fri, 14 Jul 2017 20:00:32 +0000:

[…]

 >>> SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"

 >>> for x in ${SSHVARS} ; do
 >>>     (eval echo $x=\$$x) | sed  's/=/="/
 >>>                                 s/$/"/
 >>>                                 s/^/export /'

 >> Bash позволил бы обойтись без eval ("${x}=${!x}"), но, похоже, POSIX
 >> такую подстановку не регламентирует.

 >> … Однако вполне можно обойтись без Sed:

 >> eval echo export "$x"=\\\'\${"$x"//\\\'/\\\'\\\\\\\'\\\'}\\\'

 > Ой...  Спасибо, я лучше sed.  То, что написано у меня, я хотя бы
 > прочесть в состоянии...

        «Нечитаемая» часть моего варианта относится не к замене Sed, а к
        обработке всех возможных имен файлов.  Другими словами —
        содержащих одинарные кавычки (всюду заменяемые на «'\''»):

$ XYZ=/a\'b\ c\*\'d 
$ x=XYZ 
$ eval echo export "$x"=\\\'\${"$x"//\\\'/\\\'\\\\\\\'\\\'}\\\' 
export XYZ='/a'\''b c*'\''d'
$ 

        Если этого не требуется — убираем подстановку с заменой
        ${(имя)//(шаблон)/(замена)}:

   eval echo export "$x"=\\\'\$"$x"\\\'

        Или же (по вкусу):

   eval echo export "$x=\\'\$$x\\'"

        Cf. исходный eval:

   eval echo         $x=\$$x

-- 
FSF associate member #7257  58F8 0F47 53F5 2EB2 F6A5  8916 3013 B6A0 230E 334A

Ответить