在 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
在 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