1
\$\begingroup\$

My intention is to POSIX-ly write one generalized function for running various text editors I use for different purposes through sudoedit, i.e. editing files as root safely. Safely = for instance, if a power loss occurs during the file edit; another example could be lost SSH connection, etc.


Originally, I had these Bash functions defined for this purpose in my .bash_aliases file:

function sucode
{
 export SUDO_EDITOR='/usr/bin/code --wait'
 sudoedit "$@"
}
function susubl
{
 export SUDO_EDITOR='/opt/sublime_text/sublime_text --wait'
 sudoedit "$@"
}
function suxed
{
 export SUDO_EDITOR='/usr/bin/xed --wait'
 sudoedit "$@"
}

Since yesterday, I'm trying to generalize that solution for other Linux users to be able to take advantage of it. Momentary peek:

# Text editing as root; The proper way through `sudoedit`.
sudoedit_internal()
{
 [ "${#}" -lt 3 ] && { printf '%s\n' 'sudoedit_internal(): Invalid number of arguments.' 1>&2; return; }
 editor_path=$( command -v "${1}" )
 [ -x "${editor_path}" ] || { printf '%s\n' "sudoedit_internal(): The editor path ${editor_path} does not exist on this system." 1>&2; return; }
 editor_wait_option=${2}
 shift 2
 env SUDO_EDITOR="${editor_path} ${editor_wait_option}" sudoedit "${@}"
}
# CLI
suvi() { sudoedit_internal vi '' "${@}"; }
sunano() { sudoedit_internal nano '' "${@}"; }
# GUI
sucode() { sudoedit_internal code -w "${@}"; }
susubl() { sudoedit_internal subl -w "${@}"; }
suxed() { sudoedit_internal xed -w "${@}"; }

These 5 editors I use. Please take that as an example only.

As I should not update this question any further, you can find the up-to-date version of this script snippet in my Unix & Linux Answer.

asked Apr 7, 2019 at 10:39
\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

It's good form to return non-zero on error. The not-optional option is a little ugly and an environment variable may work better.

Some extraneous syntax can go:

  • 1 before >&2 is implied
  • {} around unsubstituted dereferences doesn't add anything
  • echo is an alias for printf "%s\n"
  • testing for error instead of success allows test && echo && return without braces
  • command -v tests validity for you; no need to test again
  • you've moved the complexity into a function already; reward yourself by using aliases to invoke it
sudoedit_internal()
{
 [ $# -lt 2 ] && echo "sudoedit_internal(): Invalid number of arguments." >&2 && return 1
 ! command -v "1ドル" >/dev/null && echo "sudoedit_internal(): The editor 1ドル does not exist on this system." >&2 && return 1
 editor="1ドル"; shift 
 SUDO_EDITOR="$editor $opt" sudoedit "$@"
}
for ed in vi nano ; do alias su$ed="opt= sudoedit_internal $ed"; done
for ed in code subl xed ; do alias su$ed="opt=-w sudoedit_internal $ed"; done
answered Apr 8, 2019 at 6:27
\$\endgroup\$
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.