出于某種原因,我無法cd在shake/commandHaskell 庫中執行命令。它認為我呼叫的目錄cd不存在,即使它存在于檔案系統中。
這是我的代碼的摘錄:
dataDir = "data"
data Settings = Settings {
url :: String
} deriving (Eq, Show, Generic, JSON.ToJSON, JSON.FromJSON)
settings :: String -> Handler Settings
settings subfolder = let
gitPath = dataDir "/" subfolder "/git/.git"
in do
pathExists <- liftIO $ doesPathExist gitPath
-- Stdout pwdOut <- liftIO $ cmd ("pwd" :: String)
-- liftIO $ putStrLn $ pwdOut
if not pathExists
then do
liftIO $ (cmd_ ("mkdir -p" :: String) [gitPath] :: IO ())
liftIO $ (cmd_ ("cd" :: String) [gitPath] :: IO ())
liftIO $ (cmd_ ("git init" :: String) :: IO ())
return $ Settings { url = ""}
else do
liftIO $ (cmd_ (Cwd ".") ("cd" :: String) [gitPath] :: IO ())
Stdout out <- liftIO $ (cmd ("git config --get remote.origin.url" :: String))
return $ Settings {url = out}
cd: createProcess: runInteractiveProcess: exec: does not exist (No such file or directory)在兩種情況下它都會失敗并出現錯誤:如果 dir 存在以及何時mkdir執行命令。
無法將我的頭環繞在它周圍。但在我向 Shake 的 github 頁面提交錯誤之前,我想與您確認我沒有做任何可能導致這種行為的愚蠢行為。
預先感謝您的幫助。
uj5u.com熱心網友回復:
Shake 的Haddock 頁面描述了cmd_,并鏈接到其來源。在那里我們可以看到cmd_最終呼叫commandExplicitIO,它構造了一個ProcessOptswithRawCommand并將它傳遞給process。process然后將ProcessOpts其作為RawCommand(via cmdSpec) 進行模式匹配,然后呼叫proc. 我們現在已經進入了有據可查的區域:你必須給出proc一個可執行檔案,而cd不是一個可執行檔案。(為什么?由于行程無法更改其父行程的作業目錄,因此cd必須是內置的 shell。)
uj5u.com熱心網友回復:
正如在其他的答案中描述,cd是不是可執行檔案,所以如果你想運行它,你就必須通過Shell到cmd。
然而,幾乎可以肯定,你不想呼叫的情況下cd在命令,因為它并沒有改變目錄的任何后續命令。每個cmd都是一個單獨的行程,具有單獨的環境,因此后續命令將在一個全新的環境中,并且與之前的作業目錄相同cd。解決方法是將(Cwd gitPath)要操作的每個命令傳遞給給定目錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316832.html
上一篇:值在Haskell中被丟棄
下一篇:“可撤銷”應用函子的例子?
