diff --git a/.bash_profile b/.bash_profile index d44e782..908f77e 100644 --- a/.bash_profile +++ b/.bash_profile @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# if [[ $- == *i* ]]; then -# shellcheck source=.bashrc -. "$HOME/.bashrc" -# fi +if [[ $- == *i* ]]; then + # shellcheck source=.bashrc + . "$HOME/.bashrc" +fi diff --git a/.bashrc b/.bashrc index e88b2ed..cfb0ea7 100644 --- a/.bashrc +++ b/.bashrc @@ -7,7 +7,7 @@ asdf_dir="$MEATBOX_LIBS_DIR/asdf" # load `asdf`, our version manager if [ -d "$asdf_dir" ]; then - # shellcheck source=.meatbox/libs/asdf/asdf.sh + # shellcheck source=libs/asdf/asdf.sh . "$asdf_dir/asdf.sh" fi diff --git a/.circleci/config.yml b/.circleci/config.yml index b7fd528..41f634a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -32,7 +32,7 @@ jobs: name: "Build Dockerfile" command: | apk add --no-cache git >/dev/null 2>&1 - cd scripts/linux/alpine + cd ./scripts/alpine GIT_COMMIT_SHA1=$CIRCLE_SHA1 ./build.sh no_output_timeout: 30m @@ -46,7 +46,7 @@ jobs: name: "Build Dockerfile" command: | apk add --no-cache git >/dev/null 2>&1 - cd scripts/linux/arch + cd ./scripts/arch GIT_COMMIT_SHA1=$CIRCLE_SHA1 ./build.sh no_output_timeout: 30m diff --git a/.zprofile b/.zprofile index 6865338..c372a18 100644 --- a/.zprofile +++ b/.zprofile @@ -12,10 +12,6 @@ if (( $#commands[(i)lesspipe(|.sh)] )); then export LESSOPEN="| /usr/bin/env $commands[(i)lesspipe(|.sh)] %s 2>&-" fi -# }}} - -#: tmp directory {{{ - # if we don't have a TMPDIR variable set or it's empty, export it if [ -z "${TMPDIR}" ]; then export TMPDIR="/tmp/zsh-${UID}" diff --git a/bin/git-clone-or-update b/bin/git-clone-or-update index 4e90201..f45392b 100755 --- a/bin/git-clone-or-update +++ b/bin/git-clone-or-update @@ -1,17 +1,19 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu git_clone_or_update() { - local repo_url="$1" - local repo_dir="$2" + repo_url="$1" + repo_dir="$2" # use the repository's name as the directory if we didn't explicitly pass one - if is empty "$repo_dir"; then + if [ -z "$repo_dir" ]; then repo_dir="${repo_dir%.git}" fi - if is not a directory "$repo_dir"; then + if [ ! -d "$repo_dir" ]; then + mkdir -p "$repo_dir" + git clone "$repo_url" "$repo_dir" >/dev/null else ( diff --git a/bin/meatbox b/bin/meatbox index 846ee64..3aaeee2 100755 --- a/bin/meatbox +++ b/bin/meatbox @@ -25,63 +25,53 @@ log_message() { } meatbox_run_script() { - directory="$1" - script="$2" + ctx="$1" + cmd="$2" - (cd "$MEATBOX_SCRIPTS_DIR/$directory" && "./$script") -} - -meatbox_run_universal_script() { - script="$1" - - meatbox_run_script "universal" "$script" -} - -meatbox_run_os_script() { - script="$1" - os="$(uname -s | lowercase)" - - if [ -f "$MEATBOX_SCRIPTS_DIR/$os/$script" ]; then - meatbox_run_script "$os" "$script" + if [ -f "$MEATBOX_SCRIPTS_DIR/$ctx/$cmd.sh" ]; then + (cd "$MEATBOX_SCRIPTS_DIR/$ctx" && "./$cmd.sh") fi } -meatbox_help() { - usage -} +meatbox_run() { + meatbox_run_script "$kernel" "$cmd" + + if [ "$kernel" = "linux" ]; then + distro="" -meatbox_bootstrap() { - start-sudo-loop "$MEATBOX_PASSWORD" + # cat /etc/*release - meatbox_run_os_script "bootstrap.sh" - meatbox_run_universal_script "bootstrap.sh" -} + # ID=alpine + # NAME="Alpine Linux" -if [ "$1" = "bootstrap" ]; then - meatbox_bootstrap + # ID=antergos + # ID_LIKE=archlinux + # NAME="Antergos Linux" + # PRETTY_NAME="Antergos Linux" - exit 0 -fi + # DISTRIB_ID=Arch + # NAME="ArchBang Linux" + # ID=arch + # PRETTY_NAME="ArchBang Linux" -meatbox_setup() { - start-sudo-loop "$MEATBOX_PASSWORD" + meatbox_run_script "$distro" "$cmd" + fi - meatbox_run_os_script "setup.sh" - meatbox_run_universal_script "setup.sh" + meatbox_run_script "agnostic" "$cmd" } -meatbox_update() { - start-sudo-loop "$MEATBOX_PASSWORD" - - meatbox_run_os_script "update.sh" - meatbox_run_universal_script "update.sh" +meatbox_help() { + usage } meatbox() { cmd="$1" case "$cmd" in - bootstrap|setup|update) "meatbox_$cmd" ;; + bootstrap|setup|update) + start-sudo-loop "$MEATBOX_PASSWORD" + meatbox_run "$cmd" + ;; *) meatbox_help ;; esac } diff --git a/bin/meatman b/bin/meatman new file mode 100755 index 0000000..cc92799 --- /dev/null +++ b/bin/meatman @@ -0,0 +1,27 @@ +#!/bin/sh + +set -o errexit -o nounset + +# TODO: requires much smarter implementation w/ handling of various managers, +# operations, and flags +meatman() { + cmd="$1" + packages="$2" + + if [ ! "$cmd" = "add" ]; then + echo "command unsupported" + exit 1 + fi + +# TODO: handle flags + if [ -x "$(command -v pacman)" ]; then + sudo pacman -S --noconfirm --needed $packages + elif [ -x "$(command -v apk)" ]; then + sudo apk add --no-cache $packages + else + echo "unsupported distro" + exit 1 + fi +} + +meatman "$@" diff --git a/bin/pacfast b/bin/pacfast index fda546b..c92c077 100755 --- a/bin/pacfast +++ b/bin/pacfast @@ -43,7 +43,7 @@ download_packages() { --dir="$cache_dir" rm "$dl_list_file" -} +} # if we have unfinished jobs from a previous run, complete them if [ -f "$dl_list_file" ]; then diff --git a/bin/start-sudo-loop b/bin/start-sudo-loop index c01b0ed..0e44a22 100755 --- a/bin/start-sudo-loop +++ b/bin/start-sudo-loop @@ -1,9 +1,9 @@ -#!/usr/bin/env bash +#!/bin/sh -set -eo pipefail +set -e start_sudo_loop() { - local password="$1" + password="$1" if [ -n "$password" ]; then echo "$password" | sudo -Sv diff --git a/index.sh b/index.sh index 03c2fce..5182f35 100755 --- a/index.sh +++ b/index.sh @@ -12,23 +12,26 @@ export MEATBOX_SCRIPTS_DIR="$MEATBOX_DIR/scripts" cd "$HOME" # ensure the user has a /bin directory, and add it to the path -mkdir "$MEATBOX_BIN_DIR" +if [ ! -d "$MEATBOX_BIN_DIR" ]; then + mkdir "$MEATBOX_BIN_DIR" +fi export PATH="$MEATBOX_BIN_DIR:$PATH" # pull down `yadm` and symlink it into our user's /bin -YADM_DIR="$MEATBOX_LIBS_DIR/yadm" +yadm_dir="$MEATBOX_LIBS_DIR/yadm" -if [ ! -d "$YADM_DIR" ]; then - git clone https://github.com/TheLocehiliosan/yadm.git "$YADM_DIR" >/dev/null +if [ ! -d "$yadm_dir" ]; then + git clone https://github.com/thelocehiliosan/yadm.git "$yadm_dir" >/dev/null - ln -fs "$YADM_DIR/yadm" "$MEATBOX_BIN_DIR/yadm" + ln -fs "$yadm_dir/yadm" "$MEATBOX_BIN_DIR/yadm" fi # clone our system config and update origin to use SSL in the future yadm clone -f https://github.com/meatwallace/dotfiles >/dev/null yadm remote set-url origin "git@github.com:meatwallace/dotfiles.git" +# check out a specific commit if it's been specified e.g. CI pull request if [ -n "$MEATBOX_CHECKOUT_SHA1" ]; then yadm checkout "$MEATBOX_CHECKOUT_SHA1" fi diff --git a/scripts/agnostic/bootstrap.sh b/scripts/agnostic/bootstrap.sh index 5e58b04..2a78fc6 100755 --- a/scripts/agnostic/bootstrap.sh +++ b/scripts/agnostic/bootstrap.sh @@ -1,8 +1,9 @@ #!/bin/sh -set -eu +set -o errexit -o errexit scripts=" + install_yarn.sh install_or_update_asdf.sh " diff --git a/scripts/agnostic/install_or_update_asdf.sh b/scripts/agnostic/install_or_update_asdf.sh index 1b5dc7a..a178d86 100755 --- a/scripts/agnostic/install_or_update_asdf.sh +++ b/scripts/agnostic/install_or_update_asdf.sh @@ -1,12 +1,16 @@ -#!/bin/sh +#!/usr/bin/env bash -set -eu +set -euo pipefail asdf_dir="$MEATBOX_LIBS_DIR/asdf" if [ ! -x "$(command -v asdf)" ]; then # TODO(#27): create an `unzip` install script as `lua` requires it - sudo pacman -Sy --noconfirm unzip >/dev/null + if [ -x "$(command -v pacman)" ]; then + sudo pacman -Sy --noconfirm unzip >/dev/null + else + sudo apk add --no-cache unzip + fi # clone in our version manager git clone https://github.com/asdf-vm/asdf.git "$asdf_dir" >/dev/null diff --git a/scripts/agnostic/install_or_update_python_packages.sh b/scripts/agnostic/install_or_update_python_packages.sh index 6921594..6d40e0a 100755 --- a/scripts/agnostic/install_or_update_python_packages.sh +++ b/scripts/agnostic/install_or_update_python_packages.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu pip install --user --upgrade \ pip \ diff --git a/scripts/agnostic/install_or_update_zplugin.sh b/scripts/agnostic/install_or_update_zplugin.sh index 55e0095..38e6d6f 100755 --- a/scripts/agnostic/install_or_update_zplugin.sh +++ b/scripts/agnostic/install_or_update_zplugin.sh @@ -1,5 +1,5 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu sh -c "$(curl -fsSL https://raw.githubusercontent.com/meatwallace/zplugin/master/doc/install.sh)" diff --git a/scripts/agnostic/install_yarn.sh b/scripts/agnostic/install_yarn.sh new file mode 100755 index 0000000..1dc2ca6 --- /dev/null +++ b/scripts/agnostic/install_yarn.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -o errexit -o nounset + + +install_yarn() { + meatman add yarn +} + +install_yarn "$@" diff --git a/scripts/agnostic/load_zsh.sh b/scripts/agnostic/load_zsh.sh index 72ff3cb..b570e79 100755 --- a/scripts/agnostic/load_zsh.sh +++ b/scripts/agnostic/load_zsh.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu # fire up zsh to trigger zplugin initialization zsh diff --git a/scripts/agnostic/update.sh b/scripts/agnostic/update.sh index 6537085..13425b6 100755 --- a/scripts/agnostic/update.sh +++ b/scripts/agnostic/update.sh @@ -2,7 +2,7 @@ set -eu -declare scripts=" +scripts=" install_or_update_asdf.sh install_or_update_node_modules.sh install_or_update_python_packages.sh diff --git a/scripts/alpine/Dockerfile b/scripts/alpine/Dockerfile index 1e7918a..9cebb68 100644 --- a/scripts/alpine/Dockerfile +++ b/scripts/alpine/Dockerfile @@ -8,12 +8,13 @@ ARG USER_SUDOERS_FILE="10-user" # specific to this system's setup ARG MEATBOX_USER="meatwallace" ARG MEATBOX_PASSWORD -ARG MEATBOX_SETUP_SUDOERS_FILE="20-meatbox-setup" +ARG MEATBOX_SETUP_SUDOERS_FILE="20-setup" RUN \ - # add our user account, ensuring it's in the `wheel` group for `sudo` - adduser -D -s /bin/sh "${MEATBOX_USER}" users && \ - # set the account's password + # install the bare minimum dependencies for this setup & our dots to work + apk add --no-cache bash curl git sudo && \ + # add our user account & set the password + adduser -D -s /bin/bash "${MEATBOX_USER}" users && \ echo "${MEATBOX_USER}:${MEATBOX_PASSWORD}" | chpasswd && \ # add a sudo config file that allows our user to use `sudo` echo "${MEATBOX_USER} ALL=(ALL) ALL" >> "/etc/sudoers.d/${USER_SUDOERS_FILE}" && \ @@ -22,10 +23,8 @@ RUN \ # add a temporary sudo config file allowing our user to use pacman & make without # a password so our setup script doesn't require a custom `askpass` just for # docker - echo "${MEATBOX_USER} ALL=NOPASSWD: /bin/sh, /bin/ln, /sbin/apk, /usr/sbin/addgroup, /sbin/rc-update, /sbin/rc-service" >> "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" && \ - chmod 0440 "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" && \ - apk update && \ - apk add --no-cache curl + echo "${MEATBOX_USER} ALL=NOPASSWD: ALL" >> "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" && \ + chmod 0440 "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" # swap into our user account USER "${MEATBOX_USER}" @@ -35,7 +34,13 @@ WORKDIR "/home/${MEATBOX_USER}" ARG MEATBOX_CHECKOUT_SHA1 RUN \ - curl https://meatbox.one | sh && \ - meatbox bootstrap && \ - meatbox setup && \ - rm -rf tmp/* /var/cache/apk/* + # run our system setup script from our staging alias + curl "https://meatbox.meatwallace.now.sh" | MEATBOX_CHECKOUT_SHA1="${MEATBOX_CHECKOUT_SHA1}" bash && \ + . "/home/${MEATBOX_USER}/.bashrc" && \ + meatbox bootstrap && \ + . "/home/${MEATBOX_USER}/.bashrc" && \ + meatbox setup && \ + . "/home/${MEATBOX_USER}/.bashrc" && \ + rm -rf tmp/* /var/cache/apk/* + +CMD ["/bin/zsh"] diff --git a/scripts/alpine/add_edge_repositories.sh b/scripts/alpine/add_edge_repositories.sh index b1ccd78..2afedee 100755 --- a/scripts/alpine/add_edge_repositories.sh +++ b/scripts/alpine/add_edge_repositories.sh @@ -2,6 +2,6 @@ set -eu -sudo echo "@edge http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories -sudo echo "@edgecommunity http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories -sudo echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories +echo "@edge http://dl-cdn.alpinelinux.org/alpine/edge/main" | sudo tee -a /etc/apk/repositories +echo "@edgecommunity http://dl-cdn.alpinelinux.org/alpine/edge/community" | sudo tee -a /etc/apk/repositories +echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" | sudo tee -a /etc/apk/repositories diff --git a/scripts/alpine/enable_services.sh b/scripts/alpine/enable_services.sh index 2aed867..257b559 100755 --- a/scripts/alpine/enable_services.sh +++ b/scripts/alpine/enable_services.sh @@ -2,8 +2,6 @@ set -eu -username="$(id -u -n)" - # lightdm # libvirtd # virtlogd diff --git a/scripts/alpine/install_or_update_packages.sh b/scripts/alpine/install_or_update_packages.sh index 53b7315..1b79bf2 100755 --- a/scripts/alpine/install_or_update_packages.sh +++ b/scripts/alpine/install_or_update_packages.sh @@ -4,4 +4,5 @@ set -eu packages="$(grep -v '^\#' ./APKFile | grep .)" +# shellcheck disable=SC2086 apk add --no-cache $packages diff --git a/scripts/alpine/install_pciutils.sh b/scripts/alpine/install_pciutils.sh new file mode 100755 index 0000000..30bd9a1 --- /dev/null +++ b/scripts/alpine/install_pciutils.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -eu + +if [ ! -x "$(command -v lspci)" ]; then + apk add --no-cache pciutils +fi diff --git a/scripts/arch/Dockerfile b/scripts/arch/Dockerfile index 7903eed..c7e8285 100644 --- a/scripts/arch/Dockerfile +++ b/scripts/arch/Dockerfile @@ -4,27 +4,24 @@ FROM antergos/archlinux-base-devel:latest # specific to antergos setup when using the `base` installation -ARG ANTERGOS_SUDOERS_FILE="10-installer" +ARG USER_SUDOERS_FILE="10-user" # specific to this system's setup ARG MEATBOX_USER="meatwallace" ARG MEATBOX_PASSWORD -ARG MEATBOX_SETUP_SUDOERS_FILE="20-meatbox-setup" +ARG MEATBOX_SETUP_SUDOERS_FILE="20-setup" -# set up our system as close to what we'd get from a fresh Antergos install -# add our user account, ensuring it's in the `wheel` group for `sudo` RUN \ + # add our user account and set a passwordf useradd -m -g users -G wheel -s /bin/bash "${MEATBOX_USER}" && \ - # set the account's password echo "${MEATBOX_USER}:${MEATBOX_PASSWORD}" | chpasswd && \ - # add a sudo config file that allows the `wheel` group to use `sudo` - echo "${MEATBOX_USER} ALL=(ALL) ALL" >> "/etc/sudoers.d/${ANTERGOS_SUDOERS_FILE}" && \ - # update the file to have the correct permissions - chmod 0440 "/etc/sudoers.d/${ANTERGOS_SUDOERS_FILE}" && \ - # add a temporary sudo config file allowing our user to use pacman & make without - # a password so our setup script doesn't require a custom `askpass` just for - # docker - echo "${MEATBOX_USER} ALL=NOPASSWD: /usr/bin/bash, /usr/bin/ln, /usr/bin/make, /usr/bin/nvidia-xconfig, /usr/bin/pacman, /usr/bin/pacman-key, /usr/bin/systemctl, /usr/bin/usermod, /home/${MEATBOX_USER}/bin/pacfast" >> "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" && \ + # add a sudoers config allowing our user to use `sudo` and fix permissions + echo "${MEATBOX_USER} ALL=(ALL) ALL" >> "/etc/sudoers.d/${USER_SUDOERS_FILE}" && \ + chmod 0440 "/etc/sudoers.d/${USER_SUDOERS_FILE}" && \ + # add a temporary sudoers config file allowing our user to `sudo` freely w/o + # a password so we avoid the need for a custom `askpass` script inside the + # docker environment + echo "${MEATBOX_USER} ALL=NOPASSWD: ALL" >> "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" && \ chmod 0440 "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" # swap into our user account @@ -36,12 +33,12 @@ ARG MEATBOX_CHECKOUT_SHA1 RUN \ # run our system setup script from our staging alias - curl "https://meatbox.meatwallace.now.sh" | MEATBOX_CHECKOUT_SHA1="${MEATBOX_CHECKOUT_SHA1}" sh && \ - . "/home/${MEATBOX_USER}/.bash_profile" && \ + curl "https://meatbox.meatwallace.now.sh" | MEATBOX_CHECKOUT_SHA1="${MEATBOX_CHECKOUT_SHA1}" bash && \ + . "/home/${MEATBOX_USER}/.bashrc" && \ meatbox bootstrap && \ - . "/home/${MEATBOX_USER}/.bash_profile" && \ + . "/home/${MEATBOX_USER}/.bashrc" && \ meatbox setup && \ - . "/home/${MEATBOX_USER}/.bash_profile" && \ + . "/home/${MEATBOX_USER}/.bashrc" && \ # clean up any extraneous dependencies left over by our installation yay --clean --noconfirm && \ # clean up pacman's package cache for installed & uninstalled packages @@ -49,4 +46,4 @@ RUN \ # remove the sudo config we previously created to make our docker setup work echo "${MEATBOX_PASSWORD}" | sudo -S -i rm "/etc/sudoers.d/${MEATBOX_SETUP_SUDOERS_FILE}" -CMD ["/usr/bin/zsh"] +CMD ["/bin/zsh"] diff --git a/scripts/arch/add_pacman_repo_keys.sh b/scripts/arch/add_pacman_repo_keys.sh index 84e64ef..4be35e8 100755 --- a/scripts/arch/add_pacman_repo_keys.sh +++ b/scripts/arch/add_pacman_repo_keys.sh @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/sh + +set -eu # andontie-aur sudo pacman-key --recv-key EA50C866329648EE >/dev/null diff --git a/scripts/arch/install_pciutils.sh b/scripts/arch/install_pciutils.sh index 0984c18..d3d5a3e 100755 --- a/scripts/arch/install_pciutils.sh +++ b/scripts/arch/install_pciutils.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu if [ ! -x "$(command -v lspci)" ]; then yay -S --noconfirm "pciutils" >/dev/null diff --git a/scripts/arch/install_yay.sh b/scripts/arch/install_yay.sh index 44478a5..cf8fe38 100755 --- a/scripts/arch/install_yay.sh +++ b/scripts/arch/install_yay.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu # install `yay` if it's unavalable, a `pacman` wrapper that integrates the AUR if [ ! -x "$(command -v yay)" ]; then diff --git a/scripts/arch/update_package_configuration.sh b/scripts/arch/update_package_configuration.sh index 5b2371c..a9dbf58 100755 --- a/scripts/arch/update_package_configuration.sh +++ b/scripts/arch/update_package_configuration.sh @@ -1,3 +1,3 @@ -#!/usr/bin/env bash +#!/bin/sh -set -euo pipefail +set -eu diff --git a/scripts/arch/update_system_packages.sh b/scripts/arch/update_system_packages.sh index 13962cd..aa3ee6b 100755 --- a/scripts/arch/update_system_packages.sh +++ b/scripts/arch/update_system_packages.sh @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/sh + +set -eu # upgrade our system packages yay -Su --noconfirm >/dev/null diff --git a/scripts/linux/bootstrap.sh b/scripts/linux/bootstrap.sh index 9bd2a71..48ffe5b 100755 --- a/scripts/linux/bootstrap.sh +++ b/scripts/linux/bootstrap.sh @@ -2,13 +2,7 @@ set -eu -scripts=" - add_pacman_repo_keys.sh - refresh_package_databases.sh - update_pacman_mirrorlist.sh - install_yay.sh - install_pciutils.sh -" +scripts="" bootstrap() { for script in $scripts; do diff --git a/scripts/linux/install_or_update_x11docker.sh b/scripts/linux/install_or_update_x11docker.sh index 5b9f68f..0797687 100755 --- a/scripts/linux/install_or_update_x11docker.sh +++ b/scripts/linux/install_or_update_x11docker.sh @@ -1,5 +1,5 @@ -#!/usr/bin/env bash +#!/bin/sh -set -eo pipefail +set -e curl -fsSl https://raw.githubusercontent.com/mviereck/x11docker/master/x11docker | sudo bash -s -- --update >/dev/null