From eddd8e5f27e4ccdf594ffa1ed767f0223b9234c9 Mon Sep 17 00:00:00 2001 From: Joe Groocock Date: Sat, 15 Jul 2017 13:32:22 +0100 Subject: [PATCH] Improve dsh and drsh functions --- aliases | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/aliases b/aliases index b0bc66b..f3cd32d 100644 --- a/aliases +++ b/aliases @@ -157,9 +157,14 @@ alias dlg='docker logs -f' alias dalpine='docker run -ti --rm alpine /bin/sh' alias drm-stopped='docker container prune' alias drmi-untag='docker image prune' -alias dsh='_dsh exec' -alias drsh='_dsh "run --rm"' +alias dsh='_CMD=dsh _dsh exec' +alias drsh='_CMD=drsh _dsh "run --rm"' _dsh() { + if [ $# -lt 2 ]; then + echo "Usage: ${_CMD:-$0} [user@]container [program [args]]" >&2 + return 64 + fi + local dowhat="$1" local user=$(echo "$2" | cut -d'@' -f1 -s) local prog="${@:3:$#}" @@ -171,7 +176,27 @@ _dsh() { usercmd="--user=$user " fi - eval "docker $dowhat -ti $usercmd$host ${prog:-"/bin/sh"}" + if [ "$dowhat" = 'exec' -a -z "$(docker ps -q -f name="$host")" ]; then + echo "No such container $host" >&2 + return 5 + fi + + if [ -z "$prog" ]; then + set -o pipefail + for shell in bash sh; do + if shell_path="$(eval "docker $dowhat -ti $host which $shell" | sed 's|[\r\n]||g')"; then + prog="$shell_path" + break + fi + done + set +o pipefail + if [ -z "$prog" ]; then + echo "Warning: No shell found in path.. trying /bin/sh" >&2 + prog=/bin/sh + fi + fi + + eval "docker $dowhat -ti $usercmd$host $prog" } alias dm='docker-machine'