Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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.

share|improve this question
    
Is this answered by stackoverflow.com/questions/2197461/…? In particular, do you need "shopt -s expand_aliases"? –  fencepost Nov 11 '11 at 4:46
1  
You do not have to use an alias for this. It is much clearer to just create a second function. –  grawity Nov 11 '11 at 10:22
    
Cannot reproduce. Please provide a minimal test case that works on any computer. –  Daniel Beck Nov 28 '11 at 20:13

1 Answer 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.
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.