mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 00:06:09 +03:00
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:
@ -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
|
||||||
|
@ -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`
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user