#!/bin/bash
#  exec - Command execution support library

set -e

######
# The ``run`` Function

# run() - Encapsulates the running of commands in a way that allows
# them to be logged, simulated, and handled gracefully when not present.
#
# This function should be called whenever invoking an external program,
# calling functions that makes changes to disk, and any other location
# where such handling would be necessary to preserve its feature set.
#
# $1 - Name of command to run
# $@ - Command arguments
run() {
	info "Running $@ ..."
	if $pretend; then
		return
	fi
	local cmd=$1
	shift
	if type "$cmd" >/dev/null 2>&1; then
		$cmd "$@"
	else
		debug=true
		error "$cmd: unknown command"
	fi
}

######
# ``sudo`` Commands

# run_sudo() - Same as ``run()``, but run under ``sudo -H``
run_sudo() { run sudo -H -- "$@"; }

# run_sudo_as_user() - Same as ``run_sudo()``, but run as a given user ($1)
run_sudo_as_user() {
        local user=$1
        shift
        run sudo -u $user -H -- "$@"
}

# run_sudo_install() - Same as ``run_sudo()``, but runs ``install`` on
# with the given mode ($1), owner ($2), and group ($3).
run_sudo_install() {
	min_args 5 "$@"
	local mode=$1
	local owner=$2
	local group=$3
	shift 3
	run_sudo install --mode $mode --owner $owner --group $group "$@"
}

# seed_sudo() - Updates ``sudo`` timestamp, making it unlikely that
# subsequent calls to ``sudo`` will require a password.  This may also
# be called periodically to ensure the timestamp remains valid across
# long command invocations
seed_sudo() { sudo -s </dev/null; }

pipe_to_sudo() { sudo -s; }

# sudo_pipe_to_file() - Pipes stdin to a temporary file and then uses
# sudo to move it the named file ($1).
# $1 - Name of target file
sudo_pipe_to_file() {
	has_args 1 "$@"
	tmp=$(cmd_tempfile)
	run cat >$tmp
	run_sudo mv $tmp $1
}

######
# External Commands

# run_editor() - Runs $EDITOR with the provided arguments
run_editor() {
	[ "$EDITOR" ] || error "\$EDITOR is not set"
	run $EDITOR "$@"
}

# run_pager() - Runs $PAGER with the provided arguments
run_pager() {
	[ "$PAGER" ] || error "\$PAGER is not set"
	run clear
	run $PAGER "$@"
}

View the Developer Guide Index

View the Reference Manual Index


Generated on Fri Jul 28 14:34:53 PDT 2017 by mcsh d14 v0.23.0.