Функция bash реализует команду python

У меня есть это

python -c "import sys, urllib as ul; \
    print ul.quote('sample hihi ')"

Как я могу обернуть это в функцию bash, чтобы я мог вызывать ее как функцию так:

urlencode('sample hihi ')

Спасибо

1 ответ

Решение

Вы должны передать аргументы функции в свой код Python как обычные аргументы оболочки, к которым можно получить доступ через sys.argv массив. В функции Bash ее аргументы вызова могут быть доступны, например, через "$*", который возвращает все аргументы как один строковый аргумент, разделенный пробелами (как если бы он был заключен в кавычки целиком, а не как отдельные токены).

Вот пример, который следует вашему исходному коду:

urlquote() { python -c 'import sys, urllib as ul; print ul.quote(sys.argv[1])' "$*" ;}

Однако, поскольку поддержка Python 2 скоро закончится, вот лучший эквивалент Python 3:

urlquote() { python3 -c 'import sys, urllib.parse as ul; print(ul.quote(sys.argv[1]))' "$*" ;}

Вызов одинаков для обоих, введите имя функции, за которым следует строка, которую вы хотите закодировать в качестве аргумента. Не забудьте процитировать это соответствующим образом:

$ urlquote "roses are red, violets are blue..."
roses%20are%20red%2C%20violets%20are%20blue...

Примечание: никогда не вставляйте напрямую аргументы оболочки в строку кода Python, например python -c "print('$x')", поскольку это может привести к легко используемым рискам безопасности, если вы когда-либо планируете запускать свою функцию на ненадежном вводе, позволяя людям выполнять произвольные команды!

Посмотрите на этот пример оболочки, где я создаю аргумент в переменной x таким образом, чтобы запустить системную команду uname (который безвреден и просто печатает "Linux", но вы можете сделать все здесь):

$ x="');import os;os.system('uname');('"

$ python3 -c "print('$x')"
Linux
Другие вопросы по тегам