LINUX.ORG.RU

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

 , ,


0

1

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

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

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

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

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

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

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

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

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

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

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



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

В шелле апострофы - это особые кавычки, отменяющие любую интерполяцию внутри. 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
() автор топика
Ответ на: комментарий от khrundel

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

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

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

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

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

theNamelessOne ★★★★★
()

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

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

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

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

  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 ★★★★★
()