bash: re-enable automatic bash shell detection (#2966)

Bash shell detection was originally disabled in #1823 due to problems
with /bin/bash on macOS.

Apple distributes their own patched version of Bash 3.2 on macOS that
disables the POSIX-style $ENV-based startup path:


e5397a7e74/bash-3.2/shell.c (L1112-L1114)

This means we're unable to perform our automatic shell integration
sequence in this specific environment. Standard Bash 3.2 works fine.

Knowing this, we can re-enable bash shell detection by default unless
we're running "/bin/bash" on Darwin. We can safely assume that's the
unsupported Bash executable because /bin is non-writable on modern macOS
installations due to System Integrity Protection.

macOS users can either manually source our shell integration script
(which otherwise works fine with Apple's Bash) or install a standard
version of Bash from Homebrew or elsewhere.
This commit is contained in:
Mitchell Hashimoto
2024-12-15 07:13:53 -08:00
committed by GitHub
3 changed files with 29 additions and 10 deletions

View File

@ -231,8 +231,12 @@ function fine within Ghostty with the above mentioned shell integration features
inoperative. **If you want to disable automatic shell integration,** set inoperative. **If you want to disable automatic shell integration,** set
`shell-integration = none` in your configuration file. `shell-integration = none` in your configuration file.
Automatic `bash` shell integration requires Bash version 4 or later and must be > [!NOTE]
explicitly enabled by setting `shell-integration = bash`. >
> The version of Bash distributed with macOS (`/bin/bash`) does not support
> automatic shell integration. You'll need to manually source the shell
> integration script (as shown below). You can also install a standard
> version of Bash from Homebrew or elsewhere and set it as your shell.
**For the automatic shell integration to work,** Ghostty must either be run **For the automatic shell integration to work,** Ghostty must either be run
from the macOS app bundle or be installed in a location where the contents of from the macOS app bundle or be installed in a location where the contents of

View File

@ -18,9 +18,6 @@ our integration script (`bash/ghostty.bash`). This prevents Bash from loading
its normal startup files, which becomes our script's responsibility (along with its normal startup files, which becomes our script's responsibility (along with
disabling POSIX mode). disabling POSIX mode).
Because automatic Bash shell integration requires Bash version 4 or later, it
must be explicitly enabled (`shell-integration = bash`).
Bash shell integration can also be sourced manually from `bash/ghostty.bash`. Bash shell integration can also be sourced manually from `bash/ghostty.bash`.
This also works for older versions of Bash. This also works for older versions of Bash.
@ -31,6 +28,13 @@ if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
fi fi
``` ```
> [!NOTE]
>
> The version of Bash distributed with macOS (`/bin/bash`) does not support
> automatic shell integration. You'll need to manually source the shell
> integration script (as shown above). You can also install a standard
> version of Bash from Homebrew or elsewhere and set it as your shell.
### Elvish ### Elvish
For [Elvish](https://elv.sh), `$GHOSTTY_RESOURCES_DIR/src/shell-integration` For [Elvish](https://elv.sh), `$GHOSTTY_RESOURCES_DIR/src/shell-integration`

View File

@ -1,4 +1,5 @@
const std = @import("std"); const std = @import("std");
const builtin = @import("builtin");
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
const ArenaAllocator = std.heap.ArenaAllocator; const ArenaAllocator = std.heap.ArenaAllocator;
const EnvMap = std.process.EnvMap; const EnvMap = std.process.EnvMap;
@ -57,11 +58,21 @@ pub fn setup(
}; };
const result: ShellIntegration = shell: { const result: ShellIntegration = shell: {
// For now, bash integration must be explicitly enabled via force_shell. if (std.mem.eql(u8, "bash", exe)) {
// Our automatic shell integration requires bash version 4 or later, // Apple distributes their own patched version of Bash 3.2
// and systems like macOS continue to ship bash version 3 by default. // on macOS that disables the ENV-based POSIX startup path.
// This approach avoids the cost of performing a runtime version check. // This means we're unable to perform our automatic shell
if (std.mem.eql(u8, "bash", exe) and force_shell == .bash) { // integration sequence in this specific environment.
//
// If we're running "/bin/bash" on Darwin, we can assume
// we're using Apple's Bash because /bin is non-writable
// on modern macOS due to System Integrity Protection.
if (comptime builtin.target.isDarwin()) {
if (std.mem.eql(u8, "/bin/bash", command)) {
return null;
}
}
const new_command = try setupBash( const new_command = try setupBash(
alloc_arena, alloc_arena,
command, command,