-
-
Save dotike/8257326 to your computer and use it in GitHub Desktop.
#!/bin/sh | |
############################################################################## | |
# This code known is distributed under the following terms: | |
# | |
# Copyright (c) 2013 Isaac (.ike) Levy <[email protected]>. | |
# All rights reserved. | |
# | |
# Redistribution and use in source and binary forms, with or without | |
# modification, are permitted provided that the following conditions | |
# are met: | |
# 1. Redistributions of source code must retain the above copyright | |
# notice, this list of conditions and the following disclaimer. | |
# 2. Redistributions in binary form must reproduce the above copyright | |
# notice, this list of conditions and the following disclaimer in the | |
# documentation and/or other materials provided with the distribution. | |
# | |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
# SUCH DAMAGE. | |
############################################################################## | |
# Credits: | |
# William Baxter (safe/try pattern originator) | |
# Matthew Story (loads of use) | |
# okan@ (try refinements, config conventions) | |
# Allan Jude (try - the actual name) | |
############################################################################## | |
shout() { echo "$0: $*" >&2; } | |
die() { shout "$*"; exit 111; } | |
try() { "$@" || die "cannot $*"; } | |
# examples, using it | |
try cd /some/place | |
try tar xzvfp /another/place/stuff.tbz | |
# (you may not want to 'try' that tar, depending) | |
true | |
# alternatively, exit 0 |
shout() { echo "$0: $*" >&2; }
die() { shout "${@:2}"; exit $1; }
try() { "$@" || die $? "cannot $*"; }
echo 'About to true'
try true
echo 'About to mkdir fred'
try mkdir fred
echo 'About to mkdir fred'
try mkdir fred
outputs :
About to true
About to mkdir fred
mkdir: fred: File exists
a.sh: Cannot mkdir fred
This will track the actual exit code that caused the failure.
I think.
Hi @GIJack,
I read through your 5-fingers there, and they are not in any way related to the 3-fingr claw except that they are shell functions.
Your functions appear to be five common print-to-screen type patterns (which I assume you use quite regularly), yet the 3-finger-claw allows a user to fundamentally alter the behavior of a particular program.
Best, .ike
Not quite. Two of the functions are directly comparable
cry -> message, but sans
there is also warn to handle soft errors.
exit_with_error() -> replacement for die(). The big improvement is that it takes exit code as a parameter. You have a hardcoded 111 as an exit code. That's a magic number. As well as hardcoded exit message.
I also do not use a try because its entirely superfluous in shell as you already have || that works as except, but doesn't need a try.
so you can
[ test ] && exit_with_error 1 "Program Shit the Bed"
that's a whole lot of copyright ordinance for a simple 3-line technique that has been widely used throughout the industry for a long long time.