在 GHCi 中将 shell 更改为 运行 "shell commands"

Change shell used to run "shell commands" in GHCi

在 GHCi 中,可以使用 :!<command> 执行 shell 命令。默认情况下,似乎使用 sh shell:

Prelude> :!echo [=13=]
/bin/sh

我为 shell 定义了一些别名和自定义函数,我通常在我的系统上使用 (fish),我想从 GHCi 使用这些,但不必将它们翻译成 sh 兼容版本。

有没有办法改变 shell GHCi 用来执行 :! 命令?我找不到任何 :set 选项,也找不到 GHCi 的任何命令行参数来执行此操作。

:! command in current versions of ghci is a call to System.Process.system

-- | Entry point for execution a ':<command>' input from user
specialCommand :: String -> InputT GHCi Bool
specialCommand ('!':str) = lift $ shellEscape (dropWhile isSpace str)
-- [...]

shellEscape :: String -> GHCi Bool
shellEscape str = liftIO (system str >> return False)

我怀疑 system 被硬编码为 /bin/sh,但您没有理由不能 define your own ghci command 进行 fish 调用。我没有安装 fish,所以我将使用 bash 作为示例:

λ import System.Process (rawSystem)
λ :def bash \cmd -> rawSystem "/bin/bash" ["-c", cmd] >> return ""
λ :bash echo [=11=]
/bin/bash