Псевдоним не работает внутри сценария оболочки 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 ответа

Некоторые комментарии:

  1. При написании скрипта оболочки bash вы должны запустить скрипт с:

    #!/bin/bash
    
  2. Существует известная проблема: почему мой сценарий 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])"'
Другие вопросы по тегам