From 67afb66eb1a2e7a1f7c912bdeec002de7b25d91d Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Wed, 17 Aug 2016 17:38:45 +1200 Subject: Move simple Bash/pdksh functions into POSIX sh Have only translated the scripts that translate readily into POSIX sh for now. More complex stuff like that bd/pd/sd/ud navigation for Bash doesn't port as easily, mostly because there isn't an analogue for the "local" keyword in POSIX. --- Makefile | 6 +++++- bash/bashrc.d/bc.bash | 7 ------- bash/bashrc.d/diff.bash | 4 ---- bash/bashrc.d/ed.bash | 26 -------------------------- bash/bashrc.d/gdb.bash | 4 ---- bash/bashrc.d/gpg.bash | 10 ---------- bash/bashrc.d/hgrep.bash | 16 ---------------- bash/bashrc.d/keychain.bash | 4 ---- bash/bashrc.d/mkcd.bash | 4 ---- bash/bashrc.d/mysql.bash | 21 --------------------- bash/bashrc.d/pwgen.bash | 8 -------- bash/bashrc.d/rcsdiff.bash | 4 ---- bash/bashrc.d/scp.bash | 10 ---------- bash/bashrc.d/scr.bash | 12 ------------ bash/bashrc.d/sudo.bash | 7 ------- bash/bashrc.d/tmux.bash | 19 ------------------- bash/bashrc.d/vim.bash | 15 --------------- pdksh/pdkshrc.d/diff.pdksh | 4 ---- pdksh/pdkshrc.d/ed.pdksh | 26 -------------------------- pdksh/pdkshrc.d/gdb.pdksh | 4 ---- pdksh/pdkshrc.d/gpg.pdksh | 10 ---------- pdksh/pdkshrc.d/keychain.pdksh | 4 ---- pdksh/pdkshrc.d/mkcd.pdksh | 4 ---- pdksh/pdkshrc.d/pwgen.pdksh | 8 -------- pdksh/pdkshrc.d/rcsdiff.pdksh | 4 ---- pdksh/pdkshrc.d/scp.pdksh | 9 --------- pdksh/pdkshrc.d/scr.pdksh | 11 ----------- pdksh/pdkshrc.d/sudo.pdksh | 7 ------- pdksh/pdkshrc.d/tmux.pdksh | 19 ------------------- pdksh/pdkshrc.d/vim.pdksh | 15 --------------- sh/profile | 5 +++++ sh/shrc | 7 +++++++ sh/shrc.d/bc.sh | 7 +++++++ sh/shrc.d/diff.sh | 4 ++++ sh/shrc.d/ed.sh | 26 ++++++++++++++++++++++++++ sh/shrc.d/gdb.sh | 4 ++++ sh/shrc.d/gpg.sh | 10 ++++++++++ sh/shrc.d/hgrep.sh | 16 ++++++++++++++++ sh/shrc.d/keychain.sh | 3 +++ sh/shrc.d/mkcd.sh | 4 ++++ sh/shrc.d/mysql.sh | 19 +++++++++++++++++++ sh/shrc.d/pwgen.sh | 8 ++++++++ sh/shrc.d/rcsdiff.sh | 4 ++++ sh/shrc.d/scp.sh | 14 ++++++++++++++ sh/shrc.d/scr.sh | 6 ++++++ sh/shrc.d/sudo.sh | 5 +++++ sh/shrc.d/tmux.sh | 19 +++++++++++++++++++ sh/shrc.d/vim.sh | 13 +++++++++++++ 48 files changed, 179 insertions(+), 297 deletions(-) delete mode 100644 bash/bashrc.d/bc.bash delete mode 100644 bash/bashrc.d/diff.bash delete mode 100644 bash/bashrc.d/ed.bash delete mode 100644 bash/bashrc.d/gdb.bash delete mode 100644 bash/bashrc.d/gpg.bash delete mode 100644 bash/bashrc.d/hgrep.bash delete mode 100644 bash/bashrc.d/keychain.bash delete mode 100644 bash/bashrc.d/mkcd.bash delete mode 100644 bash/bashrc.d/mysql.bash delete mode 100644 bash/bashrc.d/pwgen.bash delete mode 100644 bash/bashrc.d/rcsdiff.bash delete mode 100644 bash/bashrc.d/scp.bash delete mode 100644 bash/bashrc.d/scr.bash delete mode 100644 bash/bashrc.d/sudo.bash delete mode 100644 bash/bashrc.d/tmux.bash delete mode 100644 bash/bashrc.d/vim.bash delete mode 100644 pdksh/pdkshrc.d/diff.pdksh delete mode 100644 pdksh/pdkshrc.d/ed.pdksh delete mode 100644 pdksh/pdkshrc.d/gdb.pdksh delete mode 100644 pdksh/pdkshrc.d/gpg.pdksh delete mode 100644 pdksh/pdkshrc.d/keychain.pdksh delete mode 100644 pdksh/pdkshrc.d/mkcd.pdksh delete mode 100644 pdksh/pdkshrc.d/pwgen.pdksh delete mode 100644 pdksh/pdkshrc.d/rcsdiff.pdksh delete mode 100644 pdksh/pdkshrc.d/scp.pdksh delete mode 100644 pdksh/pdkshrc.d/scr.pdksh delete mode 100644 pdksh/pdkshrc.d/sudo.pdksh delete mode 100644 pdksh/pdkshrc.d/tmux.pdksh delete mode 100644 pdksh/pdkshrc.d/vim.pdksh create mode 100644 sh/shrc create mode 100644 sh/shrc.d/bc.sh create mode 100644 sh/shrc.d/diff.sh create mode 100644 sh/shrc.d/ed.sh create mode 100644 sh/shrc.d/gdb.sh create mode 100644 sh/shrc.d/gpg.sh create mode 100644 sh/shrc.d/hgrep.sh create mode 100644 sh/shrc.d/keychain.sh create mode 100644 sh/shrc.d/mkcd.sh create mode 100644 sh/shrc.d/mysql.sh create mode 100644 sh/shrc.d/pwgen.sh create mode 100644 sh/shrc.d/rcsdiff.sh create mode 100644 sh/shrc.d/scp.sh create mode 100644 sh/shrc.d/scr.sh create mode 100644 sh/shrc.d/sudo.sh create mode 100644 sh/shrc.d/tmux.sh create mode 100644 sh/shrc.d/vim.sh diff --git a/Makefile b/Makefile index 1a59525e..957c7ab7 100644 --- a/Makefile +++ b/Makefile @@ -269,9 +269,13 @@ install-readline : install -pm 0644 -- readline/inputrc "$(HOME)"/.inputrc install-sh : check-sh - install -m 0755 -d -- "$(HOME)"/.profile.d + install -m 0755 -d -- \ + "$(HOME)"/.profile.d \ + "$(HOME)"/.shrc.d install -pm 0644 -- sh/profile "$(HOME)"/.profile install -pm 0644 -- sh/profile.d/* "$(HOME)"/.profile.d + install -pm 0644 -- sh/shrc "$(HOME)"/.shrc + install -pm 0644 -- sh/shrc.d/* "$(HOME)"/.shrc.d install-subversion : install -m 0755 -d -- "$(HOME)"/.subversion diff --git a/bash/bashrc.d/bc.bash b/bash/bashrc.d/bc.bash deleted file mode 100644 index 643678ac..00000000 --- a/bash/bashrc.d/bc.bash +++ /dev/null @@ -1,7 +0,0 @@ -# This function is only applicable if bc(1) has the non-POSIX -q option -command bc -q &0 2>&0 || return - -# Don't print the bc(1) welcome message -bc() { - command bc -q "$@" -} diff --git a/bash/bashrc.d/diff.bash b/bash/bashrc.d/diff.bash deleted file mode 100644 index 2c752c8d..00000000 --- a/bash/bashrc.d/diff.bash +++ /dev/null @@ -1,4 +0,0 @@ -# Use a unified format for diff(1) by default -diff() { - command diff -u "$@" -} diff --git a/bash/bashrc.d/ed.bash b/bash/bashrc.d/ed.bash deleted file mode 100644 index b87894df..00000000 --- a/bash/bashrc.d/ed.bash +++ /dev/null @@ -1,26 +0,0 @@ -# Add a colon prompt to ed when a command is expected rather than text; makes -# it feel a lot more like using ex. Only do this when stdin is a terminal, -# however. Also try and use -v for more verbose error output, and rlwrap(1) if -# it's available. -ed() { - - # We're only adding options if input is from a terminal - if [[ -t 0 ]] ; then - - # Colon prompt (POSIX) - set -- -p : "$@" - - # Verbose if available (not POSIX) - if ed -sv - &0 2>&0 ; then - set -- -v "$@" - fi - fi - - # Execute the ed(1) call, in a wrapper if appropriate and with the - # concluded options - if [[ -t 0 ]] && hash rlwrap 2>/dev/null ; then - command rlwrap ed "$@" - else - command ed "$@" - fi -} diff --git a/bash/bashrc.d/gdb.bash b/bash/bashrc.d/gdb.bash deleted file mode 100644 index ec9d4137..00000000 --- a/bash/bashrc.d/gdb.bash +++ /dev/null @@ -1,4 +0,0 @@ -# Don't print the GDB copyright message on every invocation -gdb() { - command gdb -q "$@" -} diff --git a/bash/bashrc.d/gpg.bash b/bash/bashrc.d/gpg.bash deleted file mode 100644 index 62d123ea..00000000 --- a/bash/bashrc.d/gpg.bash +++ /dev/null @@ -1,10 +0,0 @@ -# Wrapper around gpg(1) to stop ``--batch'' breaking things -gpg() { - # shellcheck disable=SC2048 - case $* in - *--ed*|*--gen-k*|*--sign-k*) - set -- --no-batch "$@" - ;; - esac - command gpg "$@" -} diff --git a/bash/bashrc.d/hgrep.bash b/bash/bashrc.d/hgrep.bash deleted file mode 100644 index 2f7f8d54..00000000 --- a/bash/bashrc.d/hgrep.bash +++ /dev/null @@ -1,16 +0,0 @@ -# Search shell history file for a pattern. If you put your whole HISTFILE -# contents into memory, then you probably don't need this, as you can just do: -# -# $ history | grep PATTERN -# -hgrep() { - if ! (($#)) ; then - printf >&2 '%s: Need a pattern\n' "$FUNCNAME" - exit 2 - fi - if ! [[ -n $HISTFILE ]] ; then - printf >&2 '%s: No HISTFILE\n' "$FUNCNAME" - exit 2 - fi - grep "$@" "$HISTFILE" -} diff --git a/bash/bashrc.d/keychain.bash b/bash/bashrc.d/keychain.bash deleted file mode 100644 index 40fe5d71..00000000 --- a/bash/bashrc.d/keychain.bash +++ /dev/null @@ -1,4 +0,0 @@ -# If GPG_TTY is set, update it -if [[ -n $GPG_TTY ]] ; then - GPG_TTY=$(tty) -fi diff --git a/bash/bashrc.d/mkcd.bash b/bash/bashrc.d/mkcd.bash deleted file mode 100644 index 6342d4a6..00000000 --- a/bash/bashrc.d/mkcd.bash +++ /dev/null @@ -1,4 +0,0 @@ -# Create a directory and change into it -mkcd() { - mkdir -p -- "$1" && builtin cd -- "$1" -} diff --git a/bash/bashrc.d/mysql.bash b/bash/bashrc.d/mysql.bash deleted file mode 100644 index 0d5ddb86..00000000 --- a/bash/bashrc.d/mysql.bash +++ /dev/null @@ -1,21 +0,0 @@ -# If a file ~/.mysql/$1.cnf exists, call mysql(1) using that file. Otherwise -# just run MySQL with given args. Use restrictive permissions on these files. -# Examples: -# -# [client] -# host=dbhost.example.com -# user=foo -# password=SsJ2pICe226jM -# -# [mysql] -# database=bar -# -mysql() { - local config - config=$HOME/.mysql/$1.cnf - if [[ -r $config ]] ; then - shift - set -- --defaults-extra-file="$config" "$@" - fi - command mysql "$@" -} diff --git a/bash/bashrc.d/pwgen.bash b/bash/bashrc.d/pwgen.bash deleted file mode 100644 index 7ba056e5..00000000 --- a/bash/bashrc.d/pwgen.bash +++ /dev/null @@ -1,8 +0,0 @@ -# Set some defaults for pwgen(1), because its defaults are to give me a long -# list of relatively short passwords, when I generally want only one good one -pwgen() { - if ! (($#)) ; then - set -- --secure -- "${PWGEN_LENGTH:-15}" "${PWGEN_COUNT:-1}" - fi - command pwgen "$@" -} diff --git a/bash/bashrc.d/rcsdiff.bash b/bash/bashrc.d/rcsdiff.bash deleted file mode 100644 index 18b1d324..00000000 --- a/bash/bashrc.d/rcsdiff.bash +++ /dev/null @@ -1,4 +0,0 @@ -# Use a unified format for rcsdiff(1) by default -rcsdiff() { - command rcsdiff -u "$@" -} diff --git a/bash/bashrc.d/scp.bash b/bash/bashrc.d/scp.bash deleted file mode 100644 index cd2f8521..00000000 --- a/bash/bashrc.d/scp.bash +++ /dev/null @@ -1,10 +0,0 @@ -# Wrap scp(1) to check for missing colons -scp() { - # shellcheck disable=SC2048 - if (($# >= 2)) && [[ $* != *:* ]] ; then - printf 'bash: %s: Missing colon, probably an error\n' \ - "$FUNCNAME" >&2 - return 2 - fi - command scp "$@" -} diff --git a/bash/bashrc.d/scr.bash b/bash/bashrc.d/scr.bash deleted file mode 100644 index bf2990fd..00000000 --- a/bash/bashrc.d/scr.bash +++ /dev/null @@ -1,12 +0,0 @@ -# Create a temporary directory and change into it, to stop me putting stray -# files into $HOME, and making the system do cleanup for me. Single optional -# argument is the string to use for naming the directory; defaults to "scr". -scr() { - if (($# <= 1)) ; then - pushd -- "$(mktd "${1:-"$FUNCNAME"}")" - else - printf 'bash: %s: too many arguments\n' \ - "$FUNCNAME" >&2 - return 2 - fi -} diff --git a/bash/bashrc.d/sudo.bash b/bash/bashrc.d/sudo.bash deleted file mode 100644 index d6d91d12..00000000 --- a/bash/bashrc.d/sudo.bash +++ /dev/null @@ -1,7 +0,0 @@ -# Add the -H parameter to sudo(8) calls, always use the target user's $HOME -sudo() { - if [[ $1 != -v ]] ; then - set -- -H "$@" - fi - command sudo "$@" -} diff --git a/bash/bashrc.d/tmux.bash b/bash/bashrc.d/tmux.bash deleted file mode 100644 index f0d0e36a..00000000 --- a/bash/bashrc.d/tmux.bash +++ /dev/null @@ -1,19 +0,0 @@ -# Attach to existing tmux session rather than create a new one if possible -tmux() { - - # If given any arguments, just use them as they are - if (($#)) ; then - : - - # If a session exists, just attach to it - elif command tmux has-session 2>/dev/null ; then - set -- attach-session -d - - # Create a new session with an appropriate name - else - set -- new-session -s "${TMUX_SESSION:-default}" - fi - - # Execute with concluded arguments - command tmux "$@" -} diff --git a/bash/bashrc.d/vim.bash b/bash/bashrc.d/vim.bash deleted file mode 100644 index 37fc1871..00000000 --- a/bash/bashrc.d/vim.bash +++ /dev/null @@ -1,15 +0,0 @@ -# If Vim exists on the system, use it instead of ex, vi, and view -if ! hash vim 2>/dev/null ; then - return -fi - -# Define functions proper -ex() { - vim -e "$@" -} -vi() { - vim "$@" -} -view() { - vim -R "$@" -} diff --git a/pdksh/pdkshrc.d/diff.pdksh b/pdksh/pdkshrc.d/diff.pdksh deleted file mode 100644 index 2c752c8d..00000000 --- a/pdksh/pdkshrc.d/diff.pdksh +++ /dev/null @@ -1,4 +0,0 @@ -# Use a unified format for diff(1) by default -diff() { - command diff -u "$@" -} diff --git a/pdksh/pdkshrc.d/ed.pdksh b/pdksh/pdkshrc.d/ed.pdksh deleted file mode 100644 index f64f6dc6..00000000 --- a/pdksh/pdkshrc.d/ed.pdksh +++ /dev/null @@ -1,26 +0,0 @@ -# Add a colon prompt to ed when a command is expected rather than text; makes -# it feel a lot more like using ex. Only do this when stdin is a terminal, -# however. Also try and use -v for more verbose error output, and rlwrap(1) if -# it's available. -ed() { - - # We're only adding options if input is from a terminal - if [[ -t 0 ]] ; then - - # Colon prompt (POSIX) - set -- -p : "$@" - - # Verbose if availble (not POSIX) - if ed -sv - &0 2>&0 ; then - set -- -v "$@" - fi - fi - - # Execute the ed(1) call, in a wrapper if appropriate and with the - # concluded options - if [[ -t 0 ]] && command -v rlwrap >/dev/null ; then - command rlwrap ed "$@" - else - command ed "$@" - fi -} diff --git a/pdksh/pdkshrc.d/gdb.pdksh b/pdksh/pdkshrc.d/gdb.pdksh deleted file mode 100644 index ec9d4137..00000000 --- a/pdksh/pdkshrc.d/gdb.pdksh +++ /dev/null @@ -1,4 +0,0 @@ -# Don't print the GDB copyright message on every invocation -gdb() { - command gdb -q "$@" -} diff --git a/pdksh/pdkshrc.d/gpg.pdksh b/pdksh/pdkshrc.d/gpg.pdksh deleted file mode 100644 index 62d123ea..00000000 --- a/pdksh/pdkshrc.d/gpg.pdksh +++ /dev/null @@ -1,10 +0,0 @@ -# Wrapper around gpg(1) to stop ``--batch'' breaking things -gpg() { - # shellcheck disable=SC2048 - case $* in - *--ed*|*--gen-k*|*--sign-k*) - set -- --no-batch "$@" - ;; - esac - command gpg "$@" -} diff --git a/pdksh/pdkshrc.d/keychain.pdksh b/pdksh/pdkshrc.d/keychain.pdksh deleted file mode 100644 index 40fe5d71..00000000 --- a/pdksh/pdkshrc.d/keychain.pdksh +++ /dev/null @@ -1,4 +0,0 @@ -# If GPG_TTY is set, update it -if [[ -n $GPG_TTY ]] ; then - GPG_TTY=$(tty) -fi diff --git a/pdksh/pdkshrc.d/mkcd.pdksh b/pdksh/pdkshrc.d/mkcd.pdksh deleted file mode 100644 index 6342d4a6..00000000 --- a/pdksh/pdkshrc.d/mkcd.pdksh +++ /dev/null @@ -1,4 +0,0 @@ -# Create a directory and change into it -mkcd() { - mkdir -p -- "$1" && builtin cd -- "$1" -} diff --git a/pdksh/pdkshrc.d/pwgen.pdksh b/pdksh/pdkshrc.d/pwgen.pdksh deleted file mode 100644 index 7ba056e5..00000000 --- a/pdksh/pdkshrc.d/pwgen.pdksh +++ /dev/null @@ -1,8 +0,0 @@ -# Set some defaults for pwgen(1), because its defaults are to give me a long -# list of relatively short passwords, when I generally want only one good one -pwgen() { - if ! (($#)) ; then - set -- --secure -- "${PWGEN_LENGTH:-15}" "${PWGEN_COUNT:-1}" - fi - command pwgen "$@" -} diff --git a/pdksh/pdkshrc.d/rcsdiff.pdksh b/pdksh/pdkshrc.d/rcsdiff.pdksh deleted file mode 100644 index 18b1d324..00000000 --- a/pdksh/pdkshrc.d/rcsdiff.pdksh +++ /dev/null @@ -1,4 +0,0 @@ -# Use a unified format for rcsdiff(1) by default -rcsdiff() { - command rcsdiff -u "$@" -} diff --git a/pdksh/pdkshrc.d/scp.pdksh b/pdksh/pdkshrc.d/scp.pdksh deleted file mode 100644 index c3565f21..00000000 --- a/pdksh/pdkshrc.d/scp.pdksh +++ /dev/null @@ -1,9 +0,0 @@ -# Wrap scp(1) to check for missing colons -scp() { - # shellcheck disable=SC2048 - if (($# >= 2)) && [[ $* != *:* ]] ; then - printf 'ksh: scp: Missing colon, probably an error\n' >&2 - return 2 - fi - command scp "$@" -} diff --git a/pdksh/pdkshrc.d/scr.pdksh b/pdksh/pdkshrc.d/scr.pdksh deleted file mode 100644 index 01bd20cb..00000000 --- a/pdksh/pdkshrc.d/scr.pdksh +++ /dev/null @@ -1,11 +0,0 @@ -# Create a temporary directory and change into it, to stop me putting stray -# files into $HOME, and making the system do cleanup for me. Single optional -# argument is the string to use for naming the directory; defaults to "scr". -scr() { - if (($# <= 1)) ; then - cd -- "$(mktd "${1:-scr}")" - else - printf 'ksh: scr: too many arguments\n' >&2 - return 2 - fi -} diff --git a/pdksh/pdkshrc.d/sudo.pdksh b/pdksh/pdkshrc.d/sudo.pdksh deleted file mode 100644 index d6d91d12..00000000 --- a/pdksh/pdkshrc.d/sudo.pdksh +++ /dev/null @@ -1,7 +0,0 @@ -# Add the -H parameter to sudo(8) calls, always use the target user's $HOME -sudo() { - if [[ $1 != -v ]] ; then - set -- -H "$@" - fi - command sudo "$@" -} diff --git a/pdksh/pdkshrc.d/tmux.pdksh b/pdksh/pdkshrc.d/tmux.pdksh deleted file mode 100644 index f0d0e36a..00000000 --- a/pdksh/pdkshrc.d/tmux.pdksh +++ /dev/null @@ -1,19 +0,0 @@ -# Attach to existing tmux session rather than create a new one if possible -tmux() { - - # If given any arguments, just use them as they are - if (($#)) ; then - : - - # If a session exists, just attach to it - elif command tmux has-session 2>/dev/null ; then - set -- attach-session -d - - # Create a new session with an appropriate name - else - set -- new-session -s "${TMUX_SESSION:-default}" - fi - - # Execute with concluded arguments - command tmux "$@" -} diff --git a/pdksh/pdkshrc.d/vim.pdksh b/pdksh/pdkshrc.d/vim.pdksh deleted file mode 100644 index 37fc1871..00000000 --- a/pdksh/pdkshrc.d/vim.pdksh +++ /dev/null @@ -1,15 +0,0 @@ -# If Vim exists on the system, use it instead of ex, vi, and view -if ! hash vim 2>/dev/null ; then - return -fi - -# Define functions proper -ex() { - vim -e "$@" -} -vi() { - vim "$@" -} -view() { - vim -R "$@" -} diff --git a/sh/profile b/sh/profile index e9e974e0..e190d6ba 100644 --- a/sh/profile +++ b/sh/profile @@ -9,3 +9,8 @@ for profile in "$HOME"/.profile.d/*.sh ; do . "$profile" done unset -v profile + +# If the shell is interactive, and ~/.shrc exists, source that too +case $- in + *i*) [ -f "$HOME"/.shrc ] && . "$HOME"/.shrc ;; +esac diff --git a/sh/shrc b/sh/shrc new file mode 100644 index 00000000..e46ec2d8 --- /dev/null +++ b/sh/shrc @@ -0,0 +1,7 @@ +# Load all the POSIX-compatible functions from ~/.shrc.d; more advanced shells +# like bash will have their own functions +for shrc in "$HOME"/.shrc.d/*.sh ; do + [ -e "$shrc" ] || continue + . "$shrc" +done +unset -v shrc diff --git a/sh/shrc.d/bc.sh b/sh/shrc.d/bc.sh new file mode 100644 index 00000000..643678ac --- /dev/null +++ b/sh/shrc.d/bc.sh @@ -0,0 +1,7 @@ +# This function is only applicable if bc(1) has the non-POSIX -q option +command bc -q &0 2>&0 || return + +# Don't print the bc(1) welcome message +bc() { + command bc -q "$@" +} diff --git a/sh/shrc.d/diff.sh b/sh/shrc.d/diff.sh new file mode 100644 index 00000000..2c752c8d --- /dev/null +++ b/sh/shrc.d/diff.sh @@ -0,0 +1,4 @@ +# Use a unified format for diff(1) by default +diff() { + command diff -u "$@" +} diff --git a/sh/shrc.d/ed.sh b/sh/shrc.d/ed.sh new file mode 100644 index 00000000..c7afb176 --- /dev/null +++ b/sh/shrc.d/ed.sh @@ -0,0 +1,26 @@ +# Add a colon prompt to ed when a command is expected rather than text; makes +# it feel a lot more like using ex. Only do this when stdin is a terminal, +# however. Also try and use -v for more verbose error output, and rlwrap(1) if +# it's available. +ed() { + + # We're only adding options if input is from a terminal + if [ -t 0 ] ; then + + # Colon prompt (POSIX) + set -- -p : "$@" + + # Verbose if available (not POSIX) + if ed -sv - &0 2>&0 ; then + set -- -v "$@" + fi + fi + + # Execute the ed(1) call, in a wrapper if appropriate and with the + # concluded options + if [ -t 0 ] && hash rlwrap 2>/dev/null ; then + command rlwrap ed "$@" + else + command ed "$@" + fi +} diff --git a/sh/shrc.d/gdb.sh b/sh/shrc.d/gdb.sh new file mode 100644 index 00000000..ec9d4137 --- /dev/null +++ b/sh/shrc.d/gdb.sh @@ -0,0 +1,4 @@ +# Don't print the GDB copyright message on every invocation +gdb() { + command gdb -q "$@" +} diff --git a/sh/shrc.d/gpg.sh b/sh/shrc.d/gpg.sh new file mode 100644 index 00000000..62d123ea --- /dev/null +++ b/sh/shrc.d/gpg.sh @@ -0,0 +1,10 @@ +# Wrapper around gpg(1) to stop ``--batch'' breaking things +gpg() { + # shellcheck disable=SC2048 + case $* in + *--ed*|*--gen-k*|*--sign-k*) + set -- --no-batch "$@" + ;; + esac + command gpg "$@" +} diff --git a/sh/shrc.d/hgrep.sh b/sh/shrc.d/hgrep.sh new file mode 100644 index 00000000..b6143b37 --- /dev/null +++ b/sh/shrc.d/hgrep.sh @@ -0,0 +1,16 @@ +# Search shell history file for a pattern. If you put your whole HISTFILE +# contents into memory, then you probably don't need this, as you can just do: +# +# $ history | grep PATTERN +# +hgrep() { + if [ "$#" -eq 0 ] ; then + printf >&2 'hgrep: Need a pattern\n' + exit 2 + fi + if ! [ -n "$HISTFILE" ] ; then + printf >&2 'hgrep: No HISTFILE\n' + exit 2 + fi + grep "$@" "$HISTFILE" +} diff --git a/sh/shrc.d/keychain.sh b/sh/shrc.d/keychain.sh new file mode 100644 index 00000000..82f83473 --- /dev/null +++ b/sh/shrc.d/keychain.sh @@ -0,0 +1,3 @@ +# If GPG_TTY is set, update it +[ -n "$GPG_TTY" ] || return +GPG_TTY=$(tty) diff --git a/sh/shrc.d/mkcd.sh b/sh/shrc.d/mkcd.sh new file mode 100644 index 00000000..6342d4a6 --- /dev/null +++ b/sh/shrc.d/mkcd.sh @@ -0,0 +1,4 @@ +# Create a directory and change into it +mkcd() { + mkdir -p -- "$1" && builtin cd -- "$1" +} diff --git a/sh/shrc.d/mysql.sh b/sh/shrc.d/mysql.sh new file mode 100644 index 00000000..00b6930c --- /dev/null +++ b/sh/shrc.d/mysql.sh @@ -0,0 +1,19 @@ +# If a file ~/.mysql/$1.cnf exists, call mysql(1) using that file. Otherwise +# just run MySQL with given args. Use restrictive permissions on these files. +# Examples: +# +# [client] +# host=dbhost.example.com +# user=foo +# password=SsJ2pICe226jM +# +# [mysql] +# database=bar +# +mysql() { + if [ -f "$HOME"/.mysql/"$1".cnf ] ; then + shift + set -- --defaults-extra-file="$HOME"/.mysql/"$1".cnf "$@" + fi + command mysql "$@" +} diff --git a/sh/shrc.d/pwgen.sh b/sh/shrc.d/pwgen.sh new file mode 100644 index 00000000..7ba056e5 --- /dev/null +++ b/sh/shrc.d/pwgen.sh @@ -0,0 +1,8 @@ +# Set some defaults for pwgen(1), because its defaults are to give me a long +# list of relatively short passwords, when I generally want only one good one +pwgen() { + if ! (($#)) ; then + set -- --secure -- "${PWGEN_LENGTH:-15}" "${PWGEN_COUNT:-1}" + fi + command pwgen "$@" +} diff --git a/sh/shrc.d/rcsdiff.sh b/sh/shrc.d/rcsdiff.sh new file mode 100644 index 00000000..18b1d324 --- /dev/null +++ b/sh/shrc.d/rcsdiff.sh @@ -0,0 +1,4 @@ +# Use a unified format for rcsdiff(1) by default +rcsdiff() { + command rcsdiff -u "$@" +} diff --git a/sh/shrc.d/scp.sh b/sh/shrc.d/scp.sh new file mode 100644 index 00000000..cc46b229 --- /dev/null +++ b/sh/shrc.d/scp.sh @@ -0,0 +1,14 @@ +# Wrap scp(1) to check for missing colons +scp() { + # shellcheck disable=SC2048 + if [ "$#" -ge 2 ] ; then + case $* in + *:*) ;; + *) + printf >&2 'scp(): Missing colon, probably an error\n' + return 2 + ;; + esac + fi + command scp "$@" +} diff --git a/sh/shrc.d/scr.sh b/sh/shrc.d/scr.sh new file mode 100644 index 00000000..255b9322 --- /dev/null +++ b/sh/shrc.d/scr.sh @@ -0,0 +1,6 @@ +# Create a temporary directory and change into it, to stop me putting stray +# files into $HOME, and making the system do cleanup for me. Single optional +# argument is the string to use for naming the directory; defaults to "scr". +scr() { + cd -- "$(mktd "${1:-scr}")" +} diff --git a/sh/shrc.d/sudo.sh b/sh/shrc.d/sudo.sh new file mode 100644 index 00000000..a5883168 --- /dev/null +++ b/sh/shrc.d/sudo.sh @@ -0,0 +1,5 @@ +# Add the -H parameter to sudo(8) calls, always use the target user's $HOME +sudo() { + [ "$1" != -v ] && set -- -H "$@" + command sudo "$@" +} diff --git a/sh/shrc.d/tmux.sh b/sh/shrc.d/tmux.sh new file mode 100644 index 00000000..bd954be8 --- /dev/null +++ b/sh/shrc.d/tmux.sh @@ -0,0 +1,19 @@ +# Attach to existing tmux session rather than create a new one if possible +tmux() { + + # If given any arguments, just use them as they are + if [ "$#" -gt 0 ] ; then + : + + # If a session exists, just attach to it + elif command tmux has-session 2>/dev/null ; then + set -- attach-session -d + + # Create a new session with an appropriate name + else + set -- new-session -s "${TMUX_SESSION:-default}" + fi + + # Execute with concluded arguments + command tmux "$@" +} diff --git a/sh/shrc.d/vim.sh b/sh/shrc.d/vim.sh new file mode 100644 index 00000000..fc04c99f --- /dev/null +++ b/sh/shrc.d/vim.sh @@ -0,0 +1,13 @@ +# If Vim exists on the system, use it instead of ex, vi, and view +command -v vim >/dev/null || return + +# Define functions proper +ex() { + vim -e "$@" +} +vi() { + vim "$@" +} +view() { + vim -R "$@" +} -- cgit v1.2.3