Return on error in shellscript instead of exit on error

I know that set -e is my friend in order to exit on error. But what to do if the script is sourced, e.g. a function is executed from console? I dont want to get the console closed on error, I just want to stop the script and display the error-message.

Do I need to check the $? of each command by hand to make that possible ?

Here an example-script myScript.sh to show the problem:

#!/bin/sh set -e  copySomeStuff() {     source="$1"     dest="$2"     cp -rt "$source" "$dest"     return 0 }  installStuff() {     dest="$1"     copySomeStuff dir1 "$dest"     copySomeStuff dir2 "$dest"     copySomeStuff nonExistingDirectory "$dest" } 

The script is used like that:

$ source myScript.sh $ installStuff 

This will just close down the console. The error displayed by cp is lost.

Replay

I would recommend having one script that you run as a sub-shell, possibly sourcing a file to read in function definitions. Let that script set the errexit shell option for itself.

When you use source from the command line, "the script" is effectively your interactive shell. Exiting means terminating the shell session. There are possibly ways around this, but the best option, if you wanted to set errexit for a session, would be to simply have:

#!/bin/bash

set -o errexit

source file_with_functions
do_things_using_functions

Additional benefit: Will not pollute the interactive session with functions.

If you source that it will ignore the #! and will apply set -e to the calling shell, so will apply to all subsequent commands.

you could force a sub-shell:

copySomeStuff()
{
    (
        set -e
        source="$1"
        dest="$2"
        cp -r "$source" "$dest"
        return 0
    )
}



Also for safety:

  • Do not use all caps variable name, as likely to collide with environment names. (we had a question last week about why a script did not work, it had a variable PATH)
  • Use quotes.
  • Always use -t or -T option for cp, mv, ln. e.g.
    • cp -t destination_directory source_files …
    • cp -T source_file destination_file

    note that -t and -T are Gnu extensions, and not available on some other Unixes, so for portability you can in place of the -t option do:

    • cp source_files … destination_directory/

    I do not know of an alternate safe form for -T

Category: bash Time: 2016-07-29 Views: 4

Related post

iOS development

Android development

Python development

JAVA development

Development language

PHP development

Ruby development

search

Front-end development

Database

development tools

Open Platform

Javascript development

.NET development

cloud computing

server

Copyright (C) avrocks.com, All Rights Reserved.

processed in 0.193 (s). 12 q(s)