Multi line alias in bash

25,730

Solution 1

You have a couple of issues here

  1. unlike in csh, in bash (and other Bourne-like shells), aliases are assigned with an = sign e.g. alias foo=bar

  2. quotes can't be nested like that; in this case, you can use single quotes around the alias and double quotes inside

  3. the backslash \ is a line continuation character: syntactically, it makes your command into a single line (the opposite of what you want)

So

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Testing: first we source the file:

$ . ./myscript.sh

then

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

If you want to use the alias within a script, then remember that aliases are only enabled by default in interactive shells: to enable them inside a script you will need to add

shopt -s expand_aliases

Regardless of everything above, you should consider using a shell function rather than an alias for things like this

Solution 2

Get used to using functions in the POSIX-type shell. You don't have any of the quoting issues:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}
Share:
25,730

Related videos on Youtube

Jovin Miranda
Author by

Jovin Miranda

Updated on September 18, 2022

Comments

  • Jovin Miranda
    Jovin Miranda over 1 year

    I have the following script. It's a simple test case where a is any string value and b is supposed to be a path.

    #!/bin/bash
    
    alias jo "\
    echo "please enter values "\
    read a \
    read -e b \
    echo "My values are $a and $b""
    

    However whenever I try to execute ./sample.sh I get the following errors:

    ./sample.sh: line 3: alias: jo: not found
    ./sample.sh: line 3: alias: echo please: not found
    ./sample.sh: line 3: alias: enter: not found
    ./sample.sh: line 3: alias: values: not found
    ./sample.sh: line 3: alias: read a read -e b echo My: not found
    ./sample.sh: line 3: alias: values: not found
    ./sample.sh: line 3: alias: are: not found
    ./sample.sh: line 3: alias: and: not found
    ./sample.sh: line 3: alias: : not found
    

    and when I try source sample.sh I get the following:

    a: Undefined variable.
    

    My aim was to make this an alias so that I can source this script and just run the alias to execute the line of commands. Can someone look at this and let me know what the error is?

    • Sergiy Kolodyazhnyy
      Sergiy Kolodyazhnyy over 5 years
      When you think you need multiline and multiple-command alias, it's time to either define a function or make a script.
    • Jovin Miranda
      Jovin Miranda over 5 years
      @SergiyKolodyazhnyy noted that
  • Barmar
    Barmar over 5 years
    Another reason to use single quotes around the alias is that variables inside double quotes are expanded, so $a and $b would be expanded at definition time, not when the alias is executed.
  • Jovin Miranda
    Jovin Miranda over 5 years
    Thanks for the solution, the issue here is despite me writing the script as given by you and when i execute it i get jo: command not found the alias for some reason doesnt get registered. when i source the file then i get this error Unmatched " . the only reason i am doing alias and not function is cause i want to call this line of code at command line and in function i dont know how to achieve that. i have seen the function call is usually within the script. Usage of alias was just to ensure i can use it like a function and call it whenever i want it
  • Jovin Miranda
    Jovin Miranda over 5 years
    Thanks for the solution, this did work when i call the function within the script. How do i call the function from command line itself, cause i have multiple such scripts and would rather want a situation where i write all the functions in one file but call them from command line instead. That was the whole reason i went for alias
  • fiatux
    fiatux over 5 years
    It's exactly the same. Put the functions in a file and source that file
  • Jovin Miranda
    Jovin Miranda over 5 years
    anyways fixed it, i was using default shell as tcsh hence the problem was coming.
  • Jovin Miranda
    Jovin Miranda over 5 years
    got it what i actually did is use the foll. command "$@" so that i could call the function name while executing the file