sh alias: command not found

1

1

I have written a very simple script like this:

function apply_to_dev {
    echo "Applying scripts to DEV..."
    alias ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"
    shopt -s nullglob
    for f in ~/src/trunk/Database/scripts/upgrades/current/*.sh
    do
        echo $f
        . $f
    done
    for f in ~/src/trunk/Database/scripts/upgrades/current/*.sql
    do
        echo $f
        FOUT=`basename "$f"`
        ISQL -i "$f" -o "$LOGDIR/$FOUT.dev.out"
    done
}

apply_to_dev

When I run it I got these error messages

~/src/trunk/Database/scripts/upgrades/current/JIRA-0192.sql
~/bin/RunSQL.sh: line 48: ISQL: command not found

Why sh/bash will think ISQL is a command and not an alias. If I add 'alias' right after 'alias ISQL=...', I can see ISQL in the alias print out.

Crazy enough, the *sh files in the first for loop actually calls ISQL too. The ISQL is visible inside the *.sh files.

Anthony Kong

Posted 2011-11-11T03:36:54.403

Reputation: 3 117

Is this answered by http://stackoverflow.com/questions/2197461/how-to-set-an-alias-inside-a-bash-shell-script? In particular, do you need "shopt -s expand_aliases"?

– fencepost – 2011-11-11T04:46:43.540

1You do not have to use an alias for this. It is much clearer to just create a second function. – user1686 – 2011-11-11T10:22:20.360

Cannot reproduce. Please provide a minimal test case that works on any computer. – Daniel Beck – 2011-11-28T20:13:06.817

Answers

1

If you must use alias ? Then it should probably be outside the script (globally as it where).

In any case its not necessary and actually wasteful. Just rub that word out and it should work as you expect.

BTW You could export it as a variable if you need it later on but within the same run.... (then sub shells would be able to "see" it.)

export ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"

or perhaps more tidily

ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"

export ISQL

Not sure if thats your intention though.

If you only want it to be local to the function, then in bash you must say so:

local ISQL="isql -Uuser -Ppwd -SDEV -DDATA -I ~/bin/interfaces"

$ help local

local: local [option] name[=value] ...
    Define local variables.

    Create a local variable called NAME, and give it VALUE.  OPTION can
    be any option accepted by `declare'.

    Local variables can only be used within a function; they are visible
    only to the function where they are defined and its children.

petergozz

Posted 2011-11-11T03:36:54.403

Reputation: 122