From 3ea46d1f597e55316b0ef1a7300dd360c417493a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20B=C3=BCckendorf?= Date: Sun, 16 Dec 2018 13:39:45 +0100 Subject: [PATCH] bash: restructured bashrc and bash_profile so they won't cause problems with scp --- .bash_profile | 9 +++-- .bashrc | 105 ++++++++++++++++++++++++++++---------------------- 2 files changed, 64 insertions(+), 50 deletions(-) diff --git a/.bash_profile b/.bash_profile index da33694..39d5eff 100644 --- a/.bash_profile +++ b/.bash_profile @@ -14,13 +14,16 @@ for file in ~/.environment.d/*.env; do done set +a -# Source the .bashrc if the Filedescriptor for stdin is opened. This is a very +unset -v file + +# Source the .bashrc if the file descriptor for stdin is opened. This is a very # simple test to determine if the .bash_profile was sourced from VT or SSH-login # where the .bashrc has to be sourced to provide a similar environment to a # terminal emulator. Found here: # https://eklitzke.org/effectively-using-bash-profile -if [[ -t 0 && -r ~/.bashrc ]]; then +# I had to move the actual test '-t 0' over to the bashrc. More information as +# to why can be found there. +if [[ -r ~/.bashrc ]]; then . ~/.bashrc fi -unset -v file diff --git a/.bashrc b/.bashrc index 46b89aa..8c47013 100644 --- a/.bashrc +++ b/.bashrc @@ -1,4 +1,14 @@ # .bashrc +# Don't load the bashrc if the terminal is not interactive. More information +# on how this test works can be found at the end of the bash_profile. I had to +# move this test here, because in remote shells the bashrc is sourced directly, +# wether the shell is really interactive or not. A brief explanation of this +# behaviour can be found here: +# https://unix.stackexchange.com/questions/257571 +if ! [[ -t 0 ]]; then + return 0 +fi + # Source global definitions if [[ -r /etc/bashrc ]]; then . /etc/bashrc @@ -6,52 +16,53 @@ fi # Bash 4 or bust if (( BASH_VERSINFO[0] < 4 )); then - echo "Please get a newer version of Bash." - echo "Your bashrc won't work otherwise." -else - - # Basic safe boolean evaluation. See this Gist for details: - # https://gist.github.com/gliech/184dc7566821442202f21dfe15e2b7ff - function truthy { - if [[ "${1,,}" == @(y|yes|on|true|1) ]]; then - return 0 - fi - return 1 - } - - function falsy { - if [[ "${1,,}" == @(n|no|off|false|0) ]]; then - return 0 - fi - return 1 - } - - function true_false_default { - case "${1,,}" in - y | yes | on | true | 1) - return 0 ;; - n | no | off | false | 0) - return 1 ;; - esac - shift - eval "$@" - return 1 - } - - export -f truthy falsy true_false_default - - if truthy $DOTFILES_ACTIVE; then - - # Source .bashrc.d - for file in ~/.bashrc.d/*.sh; do - . "$file" - done - - unset -v file - - elif [[ ! -v DOTFILES_ACTIVE ]]; then - echo "Dotfiles environment not found." - echo "You should probably reload your login session before proceeding." - fi + echo "Please get a newer version of Bash." >&2 + echo "Your bashrc won't work otherwise." >&2 + return 1 +fi + +# Basic safe boolean evaluation. See this Gist for details: +# https://gist.github.com/gliech/184dc7566821442202f21dfe15e2b7ff +function truthy { + if [[ "${1,,}" == @(y|yes|on|true|1) ]]; then + return 0 + fi + return 1 +} + +function falsy { + if [[ "${1,,}" == @(n|no|off|false|0) ]]; then + return 0 + fi + return 1 +} + +function true_false_default { + case "${1,,}" in + y | yes | on | true | 1) + return 0 ;; + n | no | off | false | 0) + return 1 ;; + esac + shift + eval "$@" + return 1 +} + +export -f truthy falsy true_false_default + +if truthy $DOTFILES_ACTIVE; then + + # Source .bashrc.d + for file in ~/.bashrc.d/*.sh; do + . "$file" + done + + unset -v file + +elif [[ ! -v DOTFILES_ACTIVE ]]; then + echo "Dotfiles environment not found." >&2 + echo "You should probably reload your login session before proceeding." >&2 + return 1 fi