Псевдоним не работает внутри сценария оболочки bash
Когда я ищу файлы.bashrc в моей системе, я получаю:
/etc/bash.bashrc
/etc/skel/.bashrc
/root/.bashrc
/usr/share/base-files/dot.bashrc
Я изменился:
/etc/bash.bashrc
/root/.bashrc
Я добавил псевдоним.
alias urldecode='python -c "import sys, urllib as ul; \
print ul.unquote_plus(sys.argv[1])"'
alias urlencode='python -c "import sys, urllib as ul; \
print ul.quote_plus(sys.argv[1])"'
Когда я запускаю команду:
urlencode 'http://example.com space'
он работает нормально из командной строки, но когда я создаю .sh
файл и положить ту же команду там я получаю:
./tf.sh: line 19: urlencode: command not found
Что случилось?
Содержание tf.sh
файл:
IP=$(curl -d "tool=checurl"-X POST https://site.com/get.py)
url='https://site.com.com/'
path=$(grep -oP '(?<=get.py\?filetype=csv\&data=).*?(?=\")' <<< $IP)
pathfull="get.py?filetype=csv&data=$path"
full=$url$pathfull
#echo $full
urlencode '$full'
3 ответа
Некоторые комментарии:
При написании скрипта оболочки bash вы должны запустить скрипт с:
#!/bin/bash
Существует известная проблема: почему мой сценарий Bash не распознает псевдонимы? - этот скрипт bash не распознает псевдонимы.
Один из вариантов решения проблемы:
В начале вашего сценария (после #!/bin/bash
) добавлять:
shopt -s expand_aliases
После source
файла с псевдонимами:
source /etc/bash.bashrc
Псевдонимы Bash обычно не раскрываются в неинтерактивных оболочках (что является сценарием). И действительно, вы не должны полагаться на псевдонимы в своих скриптах!
В будущем вам понадобится скрипт на другом компьютере, и вы забудете о псевдонимах, и он не будет работать, и вы потратите время на отладку проблемы!.
Создайте свои сценарии для непосредственного использования необходимых команд. Или создайте функции для сложных или многострочных команд. Или, что еще лучше, создайте "библиотечный" скрипт с необходимыми вам часто используемыми функциями, а затем включите его в свои скрипты.
Тем не менее, простой способ вызвать ваш скрипт со всеми экспортированными псевдонимами - это вызвать его через интерактивный bash
сессия, через -i
флаг:
$> bash -i ./tf.sh
Редактировать согласно комментарию
Просто bash
функциональная обертка для вашего python
скрипт будет:
function urldecode {
PYTHON_ARG="$1" python - <<END
import sys, urllib as ul
print ul.unquote_plus(os.environ['PYTHON_ARG'])
END
}
Используйте «python2» вместо «python» в псевдониме. Это сработало как шарм для меня.
alias urldecode='python2 -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'