0

I am not so familiar with shell script syntax and protocols.

I have written following function which accepts

  • a command string as a mandetory parameter
  • ignore error as an optional parameter

--

function quit {
    \rm -f "~/script.lock"
    exit
}

function abnormal_quit {
    echo $'\n'
    echo "Script Execution Terminated Abnormally.."
    echo "STATUS :: FAIL"
    quit
}

function exec_cmd {
    command="$1"
    continue_on_error="true"
    if [ -z "$2" ]; then
        continue_on_error="false"
    fi

    echo "========================================================"
    echo "Executing command :-"
    echo "$command ....."

    if ${command[@]}
    then
        echo "Command Executed successfully with return code : $?"
        echo "COMMAND - $command"
        echo "==============================================================="
        echo $'\n'
    else
        echo "Failed to execute command with return code :- $?"
        echo "COMMAND - $command"
        echo "==============================================================="
        echo $'\n'
        if [ $continue_on_error == "false" ]; then
            abnormal_quit
        fi
    fi
}

log_file="output.log"
exec_cmd "ls -lrt >> $log_file"

If I execute above shell script it gives me following error

[root@localhost data]# sh test.sh
========================================================
Executing command :-
ls -lrt >> log.out .....
ls: >>: No such file or directory
ls: log.out: No such file or directory
Failed to execute command with return code :- 2
COMMAND - ls -lrt >> log.out
===============================================================

Script Execution Terminated Abnormally..
STATUS :: FAIL

The issue here is - The shell script assume "ls -lrt >> log.out" as a single command and the redirection arrows are considered as an filename argument to the "ls" command. Hence throws an error ">>: No such file or directory"

Abhishek Kulkarni
  • 3,693
  • 8
  • 35
  • 42

3 Answers3

2

You can use eval to execute a command contained within a string. Try this:

if eval "$command"
then
dogbane
  • 266,786
  • 75
  • 396
  • 414
0

Try executing the command with

command=`$1`

Remember the command will get executed the moment the script is in this line, not later and command variable will hold the results of this command execution

Kelu Thatsall
  • 2,494
  • 1
  • 22
  • 50
  • That's true. I want to know why it doesn't work though :) I made a question here: http://stackoverflow.com/questions/18849567/difference-between-reverse-apostrophe-and-eval – Kelu Thatsall Sep 17 '13 at 12:15
0

Since you are not familiar with the syntax and protocols. Please get to know them first. It is not too much to read like network protocols.

First of all - decide on the type of the shell that you want to use. Syntax do change based on this.

Secondly from the scripts requirement, make sure you verify your mandatory parameter with a simple if statement check, else things are bound to go down.

You already have the answer to your question as eval anyways.

UserOp
  • 174
  • 7