Функция 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