5

When I search for .bashrc files in my system I get:

/etc/bash.bashrc
/etc/skel/.bashrc
/root/.bashrc
/usr/share/base-files/dot.bashrc

I changed:

/etc/bash.bashrc   
/root/.bashrc

I added the alias.

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])"'

When I run the command:

urlencode 'http://example.com space'

it works OK from the command line, but when I create an .sh file and put the same command there I get:

./tf.sh: line 19: urlencode: command not found

What is wrong?

Contents of tf.sh file:

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'
5
  • please show us the first lines of tf.sh
    – Yaron
    Jan 14, 2019 at 8:45
  • @Yaron oooo I did Jan 14, 2019 at 8:49
  • 5
    Possible duplicate of How to run an alias in a shell script?
    – pLumo
    Jan 14, 2019 at 8:55
  • You need to source the .bashrc in your script and make it interactive with set -i.
    – pLumo
    Jan 14, 2019 at 8:57
  • How rovovovo? Show the full command please Jan 14, 2019 at 9:03

3 Answers 3

10

Some comments:

  1. When writing a bash shell script you are expected to start the script with:

    #!/bin/bash
    
  2. There is a known issue - Why doesn't my Bash script recognize aliases? - that bash script doesn't recognize aliases.

One option to solve the issue is:

At the beginning of your script (after the #!/bin/bash) add:

shopt -s expand_aliases

Following by source of the file with the aliases:

source /etc/bash.bashrc
1
  • 1
    Just did that, didnt work Jan 14, 2019 at 9:01
4

Bash aliases are usually not expanded in non interactive shells (which a script is). And really, you shouldn't rely on aliases in your scripts!

In the future you'll need the script on a different machine, and you'll forget about the aliases, and it won't work, and you'll waste time debugging the issue!.

Create your scripts to directly use the commands needed. Or create functions for complex or multi-line commands. Or better yet, create a "library" script with common used functions you need and then include that on your scripts.

That said, a simple way to call your script with all the aliases exported is to call it through an interactive bash session, via the -i flag:

$> bash -i ./tf.sh

Edit as per comment

A simple bash function wrapper for your python script would be:

function urldecode {
    PYTHON_ARG="$1" python - <<END
        import sys, urllib as ul
        print ul.unquote_plus(os.environ['PYTHON_ARG'])
    END
}
7
  • The alias is a python command How can I make it to run it directlu onj the scrtipt? Imn happy with that Jan 14, 2019 at 9:02
  • @Bornvs.Me updated my answer Jan 14, 2019 at 9:07
  • IS the syntax ok? ./te.sh: line 11: warning: here-document at line 4 delimited by end-of-file (wanted `END') ./te.sh: line 12: syntax error: unexpected end of file Jan 14, 2019 at 9:18
  • @Bornvs.Me sorry, there should be NO spaces before END. Jan 14, 2019 at 9:19
  • File "<stdin>", line 1 import sys, urllib as ul ^ IndentationError: unexpected indent Python problem now :) Jan 14, 2019 at 9:29
0

Use 'python2' instead of 'python' in alias. It worked like a charm for me.

alias urldecode='python2 -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .