Когда я ищу .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'
Некоторые комментарии:
При написании скрипта оболочки 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])"'