{ pkgs , tools ? [] , envVars ? {} , shell ? null }: with pkgs.lib; let exportEnvVar = k: v: '' export ${escapeShellArg k}=${escapeShellArg v} echo ${escapeShellArg k}=${escapeShellArg v} ''; envVarsHook = envVars: '' echo -e "\nDEVSHELL ENVIRONMENT VARIABLES:" ${pkgs.lib.concatStringsSep "\n" ( pkgs.lib.mapAttrsToList exportEnvVar envVars )} ''; listToolsHook = tools: '' echo -e "\nDEVSHELL COMMANDS:" ls "${pkgs.symlinkJoin { name = "env"; paths = tools; }}/bin" ''; # Use the default user shell instead of Bash startUserShellHook = '' $(${pkgs.finger_bsd}/bin/finger $USER \ | ${pkgs.gnugrep}/bin/grep -oP 'Shell: \K.*') ''; in pkgs.mkShell { buildInputs = tools; shellHook = '' ${optionalString (envVars != {}) (envVarsHook envVars)} ${optionalString (tools != []) (listToolsHook tools)} ${if (shell != null) then shell else startUserShellHook} exit $? ''; }