Bash integration: Fix declare not creating global variables in .bashrc

Fixes #5254
This commit is contained in:
Kovid Goyal 2022-07-08 18:55:04 +05:30
parent 7281b9dbb1
commit d6492264c7
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 53 additions and 46 deletions

View File

@ -65,6 +65,8 @@ Detailed list of changes
- ssh kitten: A new option :code:`--symlink-strategy` to control how symlinks - ssh kitten: A new option :code:`--symlink-strategy` to control how symlinks
are copied to the remote machine (:iss:`5249`) are copied to the remote machine (:iss:`5249`)
- Bash integration: Fix declare not creating global variables in .bashrc (:iss:`5254`)
0.25.2 [2022-06-07] 0.25.2 [2022-06-07]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -285,6 +285,10 @@ PS1="{ps1}"
pty.write_to_child('\x04') pty.write_to_child('\x04')
pty.send_cmd_to_child('clear') pty.send_cmd_to_child('clear')
pty.wait_till(lambda: pty.callbacks.titlebuf) pty.wait_till(lambda: pty.callbacks.titlebuf)
with self.run_shell(shell='bash', rc=f'''PS1="{ps1}"\ndeclare LOCAL_KSI_VAR=1''') as pty:
pty.callbacks.clear()
pty.send_cmd_to_child('declare')
pty.wait_till(lambda: 'LOCAL_KSI_VAR' in pty.screen_contents())
with self.run_shell(shell='bash', rc=f'''PS1="{ps1}"''') as pty: with self.run_shell(shell='bash', rc=f'''PS1="{ps1}"''') as pty:
pty.callbacks.clear() pty.callbacks.clear()
pty.send_cmd_to_child('printf "%s\x16\a%s" "a" "b"') pty.send_cmd_to_child('printf "%s\x16\a%s" "a" "b"')

View File

@ -3,26 +3,24 @@
if [[ "$-" != *i* ]] ; then builtin return; fi # check in interactive mode if [[ "$-" != *i* ]] ; then builtin return; fi # check in interactive mode
if [[ -z "$KITTY_SHELL_INTEGRATION" ]]; then builtin return; fi if [[ -z "$KITTY_SHELL_INTEGRATION" ]]; then builtin return; fi
_ksi_inject() {
# Load the normal bash startup files # Load the normal bash startup files
if [[ -n "$KITTY_BASH_INJECT" ]]; then if [[ -n "$KITTY_BASH_INJECT" ]]; then
builtin local kitty_bash_inject="$KITTY_BASH_INJECT" builtin declare kitty_bash_inject="$KITTY_BASH_INJECT"
builtin local ksi_val="$KITTY_SHELL_INTEGRATION" builtin declare ksi_val="$KITTY_SHELL_INTEGRATION"
builtin unset KITTY_SHELL_INTEGRATION # ensure manual sourcing of this file in bashrc does not have any effect builtin unset KITTY_SHELL_INTEGRATION # ensure manual sourcing of this file in bashrc does not have any effect
builtin unset KITTY_BASH_INJECT ENV builtin unset KITTY_BASH_INJECT ENV
if [[ -z "$HOME" ]]; then HOME=~; fi if [[ -z "$HOME" ]]; then HOME=~; fi
if [[ -z "$KITTY_BASH_ETC_LOCATION" ]]; then KITTY_BASH_ETC_LOCATION="/etc"; fi if [[ -z "$KITTY_BASH_ETC_LOCATION" ]]; then KITTY_BASH_ETC_LOCATION="/etc"; fi
_ksi_safe_source() { _ksi_sourceable() {
if [[ -f "$1" && -r "$1" ]]; then [[ -f "$1" && -r "$1" ]] && return 0; return 1;
builtin source "$1"
builtin return 0
fi
builtin return 1
} }
if [[ "$kitty_bash_inject" == *"posix"* ]]; then if [[ "$kitty_bash_inject" == *"posix"* ]]; then
_ksi_safe_source "$KITTY_BASH_POSIX_ENV" && builtin export ENV="$KITTY_BASH_POSIX_ENV" _ksi_sourceable "$KITTY_BASH_POSIX_ENV" && {
builtin source "$KITTY_BASH_POSIX_ENV"
builtin export ENV="$KITTY_BASH_POSIX_ENV"
}
else else
builtin set +o posix builtin set +o posix
if [[ -n "$KITTY_BASH_UNEXPORT_HISTFILE" ]]; then if [[ -n "$KITTY_BASH_UNEXPORT_HISTFILE" ]]; then
@ -33,8 +31,10 @@ _ksi_inject() {
# See run_startup_files() in shell.c in the Bash source code # See run_startup_files() in shell.c in the Bash source code
if builtin shopt -q login_shell; then if builtin shopt -q login_shell; then
if [[ "$kitty_bash_inject" != *"no-profile"* ]]; then if [[ "$kitty_bash_inject" != *"no-profile"* ]]; then
_ksi_safe_source "$KITTY_BASH_ETC_LOCATION/profile" _ksi_sourceable "$KITTY_BASH_ETC_LOCATION/profile" && builtin source "$KITTY_BASH_ETC_LOCATION/profile"
_ksi_safe_source "$HOME/.bash_profile" || _ksi_safe_source "$HOME/.bash_login" || _ksi_safe_source "$HOME/.profile" for _ksi_i in "$HOME/.bash_profile" "$HOME/.bash_login" "$HOME/.profile"; do
_ksi_sourceable "$_ksi_i" && { builtin source "$_ksi_i"; break; }
done
fi fi
else else
if [[ "$kitty_bash_inject" != *"no-rc"* ]]; then if [[ "$kitty_bash_inject" != *"no-rc"* ]]; then
@ -43,19 +43,20 @@ _ksi_inject() {
# Arch, Debian, Ubuntu use /etc/bash.bashrc # Arch, Debian, Ubuntu use /etc/bash.bashrc
# Fedora uses /etc/bashrc sourced from ~/.bashrc instead of SYS_BASHRC # Fedora uses /etc/bashrc sourced from ~/.bashrc instead of SYS_BASHRC
# Void Linux uses /etc/bash/bashrc # Void Linux uses /etc/bash/bashrc
_ksi_safe_source "$KITTY_BASH_ETC_LOCATION/bash.bashrc" || _ksi_safe_source "$KITTY_BASH_ETC_LOCATION/bash/bashrc" for _ksi_i in "$KITTY_BASH_ETC_LOCATION/bash.bashrc" "$KITTY_BASH_ETC_LOCATION/bash/bashrc" ; do
_ksi_sourceable "$_ksi_i" && { builtin source "$_ksi_i"; break; }
done
if [[ -z "$KITTY_BASH_RCFILE" ]]; then KITTY_BASH_RCFILE="$HOME/.bashrc"; fi if [[ -z "$KITTY_BASH_RCFILE" ]]; then KITTY_BASH_RCFILE="$HOME/.bashrc"; fi
_ksi_safe_source "$KITTY_BASH_RCFILE" _ksi_sourceable "$KITTY_BASH_RCFILE" && builtin source "$KITTY_BASH_RCFILE"
fi fi
fi fi
fi fi
builtin unset KITTY_BASH_RCFILE KITTY_BASH_POSIX_ENV KITTY_BASH_ETC_LOCATION builtin unset KITTY_BASH_RCFILE KITTY_BASH_POSIX_ENV KITTY_BASH_ETC_LOCATION
builtin unset -f _ksi_safe_source builtin unset -f _ksi_sourceable
builtin export KITTY_SHELL_INTEGRATION="$ksi_val" builtin export KITTY_SHELL_INTEGRATION="$ksi_val"
builtin unset _ksi_i ksi_val kitty_bash_inject
fi fi
}
_ksi_inject
builtin unset -f _ksi_inject
if [ "${BASH_VERSINFO:-0}" -lt 4 ]; then if [ "${BASH_VERSINFO:-0}" -lt 4 ]; then
builtin unset KITTY_SHELL_INTEGRATION builtin unset KITTY_SHELL_INTEGRATION