псевдоним, не работающий в, колотит сценарий оболочки

Когда я ищу .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'
0
задан 14 January 2019 в 13:02

3 ответа

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

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

    #!/bin/bash
    
  2. известная проблема - почему мой сценарий Bash не распознает псевдонимы? - этот сценарий bash не распознает псевдонимы.

Один из вариантов решения проблемы:

В начале вашего сценария (после #!/bin/bash) добавьте:

shopt -s expand_aliases

После source из файл с псевдонимами:

source /etc/bash.bashrc
1
ответ дан 14 January 2019 в 13:02

Псевдонимы 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
}
0
ответ дан 14 January 2019 в 13:02

Используйте 'python2' вместо 'python' в псевдониме. Это сработало как шарм для меня.

alias urldecode='python2 -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'
0
ответ дан 13 January 2021 в 20:47

Другие вопросы по тегам:

Похожие вопросы: