Как использовать чистую строку в качестве аргумента для программы на Python через терминал bash - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь передать аргумент моей программе на Python через терминал. Для этого я использую строки:

import sys
something = sys.argv[1]

Я сейчас пытаюсь вставить строку через терминал bash:

python my_script.py 2m+{N7HiwH3[>!"4y?t9*y@;/$Ar3wF9+k$[3hK/WA=aMzF°L0PaZTM]t*P|I_AKAqIb0O4@ cm=sl)WWYwEg10DDv%k/"c{LrS)oVd§4>8bs:;9u$ *W_SGk3CXe7hZMm$nXyhAuHDi-q+ug5+%ioou.,IhC]-_O§V]^,2q:VBVyTTD6'aNw9:oan(s2SzV

Возвращает ошибку bash, поскольку некоторые символы в строке являются специальными символами bash. Как я могу использовать строку так, как она есть?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Вы можете поместить необработанную строку в файл, например, так: cat и документ here.

cat <<'EOF' > file.txt
2m+{N7HiwH3[>!"4y?t9*y@;/$Ar3wF9+k$[3hK/WA=aMzF°L0PaZTM]t*P|I_AKAqIb0O4@ cm=sl)WWYwEg10DDv%k/"c{LrS)oVd§4>8bs:;9u$ *W_SGk3CXe7hZMm$nXyhAuHDi-q+ug5+%ioou.,IhC]-_O§V]^,2q:VBVyTTD6'aNw9:oan(s2SzV
EOF

, а затем запустить

python my_script.py "$(< file.txt)"

Вы также можете использовать текстовый редактор по вашему выбору для первого шага, если вы предпочитаете это.


Если это повторяющаяся задача, которую вы должны выполнять время от времени, вы можете упростить свою жизнь с помощью небольшого псевдонима в своей оболочке:

alias escape='read -r string ; printf "Copy this:\n%q\n" "${string}"'

Используется printf "%q" для экранирования входной строки.

Запустите его так:

escape
2m+{N7HiwH3[>!"4y?t9*y@;/$Ar3wF9+k$[3hK/WA=aMzF°L0PaZTM]t*P|I_AKAqIb0O4@ cm=sl)WWYwEg10DDv%k/"c{LrS)oVd§4>8bs:;9u$ *W_SGk3CXe7hZMm$nXyhAuHDi-q+ug5+%ioou.,IhC]-_O§V]^,2q:VBVyTTD6'aNw9:oan(s2SzV
Copy this:
2m+\{N7HiwH3\[\>\!\"4y\?t9\*y@\;/\$Ar3wF9+k\$\[3hK/WA=aMzF°L0PaZTM\]t\*P\|I_AKAqIb0O4@\ cm=sl\)WWYwEg10DDv%k/\"c\{LrS\)oVd§4\>8bs:\;9u\$\ \*W_SGk3CXe7hZMm\$nXyhAuHDi-q+ug5+%ioou.\,IhC\]-_O§V\]\^\,2q:VBVyTTD6\'aNw9:oan\(s2SzV

Вы можете использовать экранированную строку непосредственно в вашей оболочке, без дополнительных кавычек, например:

python my_script.py 2m+\{N7HiwH3\[\>\!\"4y\?t9\*y@\;/\$Ar3wF9+k\$\[3hK/WA=aMzF°L0PaZTM\]t\*P\|I_AKAqIb0O4@\ cm=sl\)WWYwEg10DDv%k/\"c\{LrS\)oVd§4\>8bs:\;9u\$\ \*W_SGk3CXe7hZMm\$nXyhAuHDi-q+ug5+%ioou.\,IhC\]-_O§V\]\^\,2q:VBVyTTD6\'aNw9:oan\(s2SzV
0 голосов
/ 08 мая 2019

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

Однако часто эта дополнительная помощь приводит к неожиданным аргументам, передаваемым в программы; и иногда приводит к выполнению нежелательных дополнительных команд. В этом случае, однако, это привело к тому, что Bash выдал ошибку.

Чтобы отключить эту дополнительную работу, Bash позволяет пользователям указывать, где аргументы должны начинаться и заканчиваться, заключая их в кавычки. Bash поддерживает одинарные кавычки (') и двойные кавычки (") для разделения аргументов. В крайнем случае, если строка может содержать одинарные и двойные кавычки (или двойные кавычки требуются, но недостаточно агрессивны), Bash позволяет указать, что специальный или пробельный символ должен быть частью смежного аргумента, предшествуя это с обратной косой чертой (\\).

Если этот метод экранирования аргументов слишком громоздок, возможно, стоит упростить интерфейс вашей программы, если он использует эти данные из файла вместо аргумента командной строки. Другой вариант - создать программу, которая загружает аргументы из более контролируемого местоположения (например, из файла) и напрямую exec s целевую программу с требуемым массивом аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...