diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,15 @@
 
 `hslua-cli` uses [PVP Versioning](https://pvp.haskell.org).
 
+## hslua-cli-1.1.0
+
+Released 2022-09-26.
+
+-   Added support for the `LUA_INIT` environment variable. The
+    behavior is as described in the Lua reference manual.
+
+-   Warnings are now enabled when flag `-W` is given.
+
 ## hslua-cli-1.0.0
 
 Released 2022-09-23.
diff --git a/hslua-cli.cabal b/hslua-cli.cabal
--- a/hslua-cli.cabal
+++ b/hslua-cli.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                hslua-cli
-version:             1.0.0
+version:             1.1.0
 synopsis:            Command-line interface for Lua
 description:         Provides an embeddable command-line interface for Lua.
                      The interface is compatible with the standard Lua
diff --git a/src/HsLua/CLI.hs b/src/HsLua/CLI.hs
--- a/src/HsLua/CLI.hs
+++ b/src/HsLua/CLI.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP               #-}
 {-# LANGUAGE LambdaCase        #-}
 {-# LANGUAGE OverloadedStrings #-}
 {- |
@@ -20,16 +21,18 @@
 import Data.Foldable (foldl')
 import Data.Maybe (listToMaybe)
 import Data.Text (Text)
+import Foreign.C.String (withCString)
 import Foreign.Ptr (nullPtr)
 import HsLua.Core (LuaE, LuaError)
 import System.Console.GetOpt
-import System.Environment (getArgs, getProgName)
+import System.Environment (getArgs, getProgName, lookupEnv)
 import System.IO (hPutStrLn, stderr)
 import qualified Lua.Auxiliary as Lua
 import qualified Lua.Constants as Lua
+import qualified Lua.Primary as Lua
 import qualified HsLua.Core as Lua
-import qualified HsLua.Marshalling as Lua
 import qualified HsLua.Core.Types as Lua
+import qualified HsLua.Marshalling as Lua
 import qualified Data.Text as T
 import qualified Data.Text.IO as T
 import qualified HsLua.Core.Utf8 as UTF8
@@ -52,7 +55,7 @@
     in concat errs ++ usageInfo usageHead luaOptions
 
   let (mscript, arg) = first listToMaybe $ splitAt 1 args
-  opts <- foldl' (>>=) (return defaultLuaOpts) actions
+  let opts = foldl' (flip ($)) defaultLuaOpts actions
   return opts
     { optScript = mscript
     , optScriptArgs = arg
@@ -90,8 +93,13 @@
 runStandalone settings = do
   opts <- getOptions
   settingsRunner settings $ do
+    let putErr = Lua.liftIO . hPutStrLn stderr
     -- print version info
     when (optVersion opts) (showVersion $ settingsVersionInfo settings)
+    when (optInteractive opts) $
+      putErr "[WARNING] Flag `-i` is not supported yet."
+    when (optNoEnv opts) $
+      putErr "[WARNING] Flag `-E` is not fully supported yet."
 
     -- push `arg` table
     case optScript opts of
@@ -107,6 +115,24 @@
         Lua.rawseti (Lua.nth 2) 0
     Lua.setglobal "arg"
 
+#if MIN_VERSION_lua(2,2,1)
+    when (optWarnings opts) $ do
+      l <- Lua.state
+      -- turn warnings on
+      Lua.liftIO $ withCString "@on" $ \w -> Lua.lua_warning l w Lua.FALSE
+#endif
+
+    -- Run init code.
+    unless (optNoEnv opts) $ do
+      init' <- Lua.liftIO $ lookupEnv "LUA_INIT"
+      (case init' of
+         Just ('@' : filename) -> Lua.dofileTrace filename
+         Just cmd              -> Lua.dostring (UTF8.fromString cmd)
+         Nothing               -> return Lua.OK)
+        >>= \case
+        Lua.OK -> pure ()
+        _      -> Lua.throwErrorAsException
+
     -- run code statements and module loading instructions
     mapM_ runCode (reverse $ optExecute opts)
 
@@ -165,22 +191,20 @@
   }
 
 -- | Lua command line options.
-luaOptions :: [OptDescr (Options -> IO Options)]
+luaOptions :: [OptDescr (Options -> Options)]
 luaOptions =
   [ Option "e" []
-    (flip ReqArg "stat" $ \stat opt -> return $
+    (flip ReqArg "stat" $ \stat opt ->
         let code = ExecuteCode $ UTF8.fromString stat
         in opt{ optExecute = code:optExecute opt })
     "execute string 'stat'"
 
   , Option "i" []
-    (NoArg $ \opt -> do
-        hPutStrLn stderr "[WARNING] Flag `-i` is not supported yet."
-        return opt { optInteractive = True })
+    (NoArg $ \opt -> opt { optInteractive = True })
     "interactive mode -- currently not supported"
 
   , Option "l" []
-    (flip ReqArg "mod" $ \mod' opt -> return $
+    (flip ReqArg "mod" $ \mod' opt ->
       let toName = Lua.Name . UTF8.fromString
           code = case break (== '=') mod' of
             (glb, '=':m)  -> RequireModule (toName glb) (toName m)
@@ -193,18 +217,14 @@
      ])
 
   , Option "v" []
-    (NoArg $ \opt -> return opt { optVersion = True })
+    (NoArg $ \opt -> opt { optVersion = True })
     "show version information"
 
   , Option "E" []
-    (NoArg $ \opt -> do
-        hPutStrLn stderr "[WARNING] Flag `-E` is not supported yet."
-        return opt { optNoEnv = True })
-    "ignore environment variables -- currently not supported"
+    (NoArg $ \opt -> opt { optNoEnv = True })
+    "ignore environment variables -- partially supported"
 
   , Option "W" []
-    (NoArg $ \opt -> do
-        hPutStrLn stderr "[WARNING] Flag `-W` is not supported yet."
-        return opt { optWarnings = True })
+    (NoArg $ \opt -> opt { optWarnings = True })
     "turn warnings on -- currently not supported"
   ]
