bashrc/.bashrc.d/cmdcopy.bash

72 lines
1.6 KiB
Bash

cmdcopy() { # Terminal output copying shortcut
#
# USAGE
#
# cmdcopy [-p <preamble>] <cmd>
#
#
# DESCRIPTION
#
# Formats the output of <cmd> to include "$ <cmd>\n" on the
# first line for easy pasting. When -p is set, <preamble>
# is added to the beginning of every resulting line.
#
#
# OPTIONS
#
# -p <preamble> Add <preamble> as a string to the
# beginning of every line.
#
#
# ENVIRONMENT
#
# cmdcopy_clipprog Specify the clipboard management
# program to use. Program must
# accept content on stdin.
# Default: `wl-copy`
# Default clipboard management program
# NOTE: Must accept final output on stdin
default_clipprog="wl-copy"
# Set $clipprog to the contents of $cmdcopy_clipprog. If $cmdcopy_clipprog
# is empty or unset, set $clipprog to the contents of $default_clipprog instead.
clipprog="${cmdcopy_clipprog:-$default_clipprog}"
# Parse command line options
while getopts :p: opt; do
case $opt in
p)
preamble="$OPTARG"
;;
\?)
echo "E: Unknown option: -$OPTARG"
return 1
;;
:)
echo "E: Option -$OPTARG requires an argument"
return 1
;;
esac
done
# Remove parsed options from $@
shift $((OPTIND -1))
# Run the command, capturing stdout and stderr
cmd_output="$("$@" 2>&1)"
# Add preamble
final_output="$(awk -v preamble="$preamble" '{print preamble $0}' <(printf '%s\n%s' "$ $*" "$cmd_output"))"
# Send final output to $clipprog
printf '%s' "$final_output" | $clipprog
# Print command output to the terminal for user feedback
printf '%s\n\ncmdcopy: Command output sent to: %s\n\n' "$final_output" "$clipprog"
}