Non iteractive shell

This is part of the Semicolon&Sons Code Diary - consisting of lessons learned on the job. You're in the unix category.

Last Updated: 2024-11-23

I had an alias for clangd set up in .zshrc.

alias clangd="$(brew --prefix llvm)/bin/clangd"

This was required because I didn't want to risk moving the homebrew C binaries into my path.

In my .vimrc I had:

if executable('clangd')
 " code to set up LSP
endif

Despite this, the LSP code never executed. This turned out to be because when you run !<cmd> in vim or /bin/bash -c <cmd> from another shell, you are launching an instance of bash in non-interactive mode. And in non-interactive mode aliases are not expanded.

Properties of non-interactive shells

When are non-interactive shells used?

For example, in a script, which you run with zsh filename. Technically you have two shells here: the interactive one you are using to start up the script, and the non-interactive one running the commands.

You can explicitly request a login zsh shell with zsh -l (l for login)