Skip to content
This repository has been archived by the owner on May 30, 2024. It is now read-only.

Source shell configuration using non-login mode #526

Merged
merged 1 commit into from
Apr 5, 2023

Conversation

vinistock
Copy link
Member

@vinistock vinistock commented Apr 3, 2023

Closes Shopify/ruby-lsp#1560

In #349, we tried to switch manually sourcing shell configuration files for using the -i flag for interactive mode. Unfortunately, that doesn't seem to always work because interactive mode tries to load other stuff we don't need, such as ~/.profile or ~/.bash_profile.

It seems less brittle to just manually source the rc files ourselves.

EDIT: instead of manually sourcing, we ended up simply dropping the -l flag, which makes shells read RC configuration files and not read profile files.

@vinistock vinistock added the bugfix This PR will fix an existing bug label Apr 3, 2023
@vinistock vinistock added this to the 2023-Q2 milestone Apr 3, 2023
@vinistock vinistock self-assigned this Apr 3, 2023
@vinistock vinistock requested a review from a team as a code owner April 3, 2023 20:24
src/ruby.ts Outdated Show resolved Hide resolved
Copy link
Member

@paracycle paracycle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the bash documentation, the rules of invocation and which files are sourced are defined as follows:

INVOCATION
       A login shell is one whose first character of argument zero is a -, or one started with the --login option.

       An interactive shell is one started without non-option arguments (unless -s is specified) and without the -c
       option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one
       started with the -i option.  PS1 is set and $- includes i if bash is interactive, allowing a shell script or a
       startup file to test this state.

       The following paragraphs describe how bash executes its startup files.  If any of the files exist but cannot be
       read, bash reports an error.  Tildes are expanded in filenames as described below under Tilde Expansion in the
       EXPANSION section.

       When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it
       first reads and executes commands from the file /etc/profile, if that file exists.  After reading that file, it
       looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the
       first one that exists and is readable.  The --noprofile option may be used when the shell is started to inhibit
       this behavior.

       When an interactive login shell exits, or a non-interactive login shell executes the exit builtin command, bash
       reads and executes commands from the file ~/.bash_logout, if it exists.

       When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc,
       if that file exists.  This may be inhibited by using the --norc option.  The --rcfile file option will force bash
       to read and execute commands from file instead of ~/.bashrc.

Since our argument zero is not a -, if we don't supply the -l flag to bash, and just supply -ic, then it will be an interactive non-login shell and it should not source any of the profile files.

I believe other shells should be exhibiting similar behaviour as well.

So, instead of starting to individually handle different shells, I think we should start by changing the flags first.

@vinistock vinistock force-pushed the vs/source_rc_files_manually branch from bd81780 to 780324c Compare April 5, 2023 19:24
@vinistock
Copy link
Member Author

@paracycle you are correct. I tested on zsh, bash and fish and all of them will source their respective configuration files when using -ic. Thank you so much for the precise solution!

@vinistock vinistock merged commit a98b7a2 into main Apr 5, 2023
@vinistock vinistock deleted the vs/source_rc_files_manually branch April 5, 2023 19:52
@paracycle paracycle changed the title Source shell configuration files manually Source shell configuration using non-login mode Apr 5, 2023
jayanth-kumar-morem pushed a commit to jayanth-kumar-morem/vscode-ruby-lsp that referenced this pull request Apr 26, 2023
…readme-for-debugging

Link to the extension README for debugging information
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bugfix This PR will fix an existing bug
Projects
None yet
3 participants