LINUX.ORG.RU

Стоп символы в: echo «my_text», такие как ' " ` $ \

 , ,


0

1

Прошу сразу не казать тапками за банальность

Я реализую передачу текста из питона в буфер обмена через команду:

/bin/echo -n "{my_text}" | /usr/bin/pbcopy

для обозначения текстового блока добавляю кавычки ", поэтому экранизирую кавычки и апостроф (на всякий случай).

Так же знаю что символы ` и $ - являются управляющими, и их так же экранизирую.

Еще обратный слэш ‘\’ - что бы не произошло управляюшее экранирование следующего символа за ним.

` -> \\`
$ -> \\$
' -> \\'
" ->  \\"
\\ -> \\\\

Вопрос в следующем, нужно ли произвести экранирование еще каких нибудь символов, что бы они не превратились в системные команды как ` и $ ?

Или еще какие нибудь фокусы нее получить.

Или это можно следить более изящно или проще/надежнее?

Заранее всем спасибо!!!



Последнее исправление: rasem (всего исправлений: 5)

Лучше избавиться от echo, сделав как тут или подобное. Может и от pdcopy можно избавиться с помощью какого-нибудь модуля.

xaizek ★★★★★
()

В шелле апострофы - это особые кавычки, отменяющие любую интерполяцию внутри. echo '$PWD' выведет не текущую директорию, а строку $PWD. Так что замени на одинарные и достаточно будет экранировать апостроф и бжкслеш

khrundel ★★★★
()

Я реализую передачу текста из питона в буфер обмена через команду

И зачем тебе для этого echo? Создаёшь subprocess, ему на stdin подаёшь данные как есть, всё.

Потом, зачем тебе какой-то pbcopy? Возьми нативный модуль для работы с clipboard. Поддержка clipboard есть в родном tkinter, и есть куча сторонних модулей:

https://pypi.org/search/?q=clipboard

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Да, я знаю что можно через tkinter, но он под мак так же использует pbcopy, как и все сторонние библиотеки. (я в исходниках смотрел)

Тут есть нюанс, я делаю функцию, которая будет в модуле, и использует нативные методы, без доп библиотек.

rasem
() автор топика
Ответ на: комментарий от xaizek

Это то же самое, но я использую модуль os, так как он в моей библиотеке и так уже подгружен.

os.system(f'/bin/echo -n "{text}" | /usr/bin/pbcopy')

я считаю что это более легкий метод чем в примере.

сколько я искал pbcopy - единственный нативный метод под мак ос для работы с буфером обмена.

его применяют и в ткинтер и в сторонних модулях для работы с буфером.

rasem
() автор топика
Ответ на: комментарий от theNamelessOne

К сожалению под мак ос больше не нашел метода загнать в буфер обмена. Как уже писал, все модули для мак используют этот же метод

rasem
() автор топика
Ответ на: комментарий от slovazap

clipboard - необходимо ставить отдельно, и он так же использует shell и pbcopy как я пронял.

на счет связки subprocess+stdin подумаю, спасибо

rasem
() автор топика
Ответ на: комментарий от khrundel

К сожалению про одинарные кавычки сразу не подумал.

Но с Ними есть нюанс, у меня во входном тексте точно проскакивают одинарные кавычки в тексте.

НО,(может это только на маке) она же (одинарная кавычка) и закрывает строку, причем \ не экранизирует, а воспринимается как символ.

rasem
() автор топика
Ответ на: комментарий от rasem

Нет это не то же самое. Там не надо ничего экранировать и вообще шелл запускать в данном случае.

xaizek ★★★★★
()
Ответ на: комментарий от rasem

Даже если единственный способ скопировать текст из скрипта в буфер обмена макоси — это вызов pbcopy, всё равно не надо использовать шелл и сношаться с экранированием. Тебе не нужен шелл для этого, для межпроцессного взаимодействия есть более подходящие инструменты (subprocess тебе уже советовали).

theNamelessOne ★★★★★
()

Вместо двойных кавычек лучше одинарные использовать - не нужно будет доллар экранировать. Внутри одинарных кавычек двойные экранировать не нужно. Да и вообще ничего не нужно - только сам \ и '

vbr ★★★★★
()
5 октября 2022 г.

Все огромное спасибо за комментарии.

Если кто начнётся на этот пост, то подведу

rasem
() автор топика

Все огромное спасибо за комментарии.

Если кто наткнется на эту тему, то подведу итоги:

  1. в Mac OS все модули python для работы с буфером обмена (сам проверял в исходниках) используют pdcopy, кроме того необходимо проверять установлены или нет доп библиотеки
  2. для текста в одинарных кавычках в OS X символы ` $ " \ просто игнорируются, надо поймать только символ: '
  3. Самое оптимальное использовать нативный модуль subprocess:

# https://stackoverflow.com/questions/8475290/

import subprocess

text = 'get_my_text_to_clipboard...'

proc = subprocess.Popen('pbcopy', stdin=subprocess.PIPE)
proc.communicate(input=text.encode())

в этом случае имеем битовую строку через пайп и забываем про экранирование.

rasem
() автор топика
Ответ на: комментарий от rasem

НО,(может это только на маке) она же (одинарная кавычка) и закрывает строку, причем \ не экранизирует, а воспринимается как символ.

Но можно сделать так:

echo '$test'\''foo'
Tanger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.