+2018-10-27  Tom Tromey  <tom@tromey.com>
+
+       * procfs.c (procfs_target::create_inferior): Use get_shell.
+       * cli/cli-cmds.c (shell_escape): Use get_shell.
+       * windows-nat.c (windows_nat_target::create_inferior): Use
+       get_shell.
+       * common/pathstuff.c (get_shell): New function.
+       * nat/fork-inferior.c (SHELL_FILE, get_startup_shell): Remove.
+       (fork_inferior): Use get_shell.
+       * common/pathstuff.h (get_shell): Declare.
+
 2018-10-27  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * NEWS: Mention changes to 'info [args|functions|locals|variables]'
 
 #include "cli/cli-utils.h"
 
 #include "extension.h"
+#include "common/pathstuff.h"
 
 #ifdef TUI
 #include "tui/tui.h"   /* For tui_active et.al.  */
 
   if ((pid = vfork ()) == 0)
     {
-      const char *p, *user_shell;
+      const char *p, *user_shell = get_shell ();
 
       close_most_fds ();
 
-      if ((user_shell = getenv ("SHELL")) == NULL)
-       user_shell = "/bin/sh";
-
       /* Get the name of the shell for arg0.  */
       p = lbasename (user_shell);
 
 
 
   return {};
 }
+
+/* See common/pathstuff.h.  */
+
+const char *
+get_shell ()
+{
+  const char *ret = getenv ("SHELL");
+  if (ret == NULL)
+    ret = "/bin/sh";
+
+  return ret;
+}
 
 
 extern std::string get_standard_cache_dir ();
 
+/* Return the file name of the user's shell.  Normally this comes from
+   the SHELL environment variable.  */
+
+extern const char *get_shell ();
+
 #endif /* PATHSTUFF_H */
 
 #include "target/target.h"
 #include "common-inferior.h"
 #include "common-gdbthread.h"
+#include "common/pathstuff.h"
 #include "signals-state-save-restore.h"
 #include "gdb_tilde_expand.h"
 #include <vector>
 
 extern char **environ;
 
-/* Default shell file to be used if 'startup-with-shell' is set but
-   $SHELL is not.  */
-#define SHELL_FILE "/bin/sh"
-
 /* Build the argument vector for execv(3).  */
 
 class execv_argv
   m_argv.push_back (NULL);
 }
 
-/* Return the shell that must be used to startup the inferior.  The
-   first attempt is the environment variable SHELL; if it is not set,
-   then we default to SHELL_FILE.  */
-
-static const char *
-get_startup_shell ()
-{
-  const char *ret = getenv ("SHELL");
-  if (ret == NULL)
-    ret = SHELL_FILE;
-
-  return ret;
-}
-
 /* See nat/fork-inferior.h.  */
 
 pid_t
 
       /* Figure out what shell to start up the user program under.  */
       if (shell_file == NULL)
-       shell_file = get_startup_shell ();
+       shell_file = get_shell ();
 
       gdb_assert (shell_file != NULL);
     }
 
                                const std::string &allargs,
                                char **env, int from_tty)
 {
-  char *shell_file = getenv ("SHELL");
+  const char *shell_file = get_shell ();
   char *tryname;
   int pid;
 
-  if (shell_file != NULL && strchr (shell_file, '/') == NULL)
+  if (strchr (shell_file, '/') == NULL)
     {
 
       /* We will be looking down the PATH to find shell_file.  If we
 
 #include "complaints.h"
 #include "inf-child.h"
 #include "gdb_tilde_expand.h"
+#include "common/pathstuff.h"
 
 #define AdjustTokenPrivileges          dyn_AdjustTokenPrivileges
 #define DebugActiveProcessStop         dyn_DebugActiveProcessStop
     }
   else
     {
-      sh = getenv ("SHELL");
-      if (!sh)
-       sh = "/bin/sh";
+      sh = get_shell ();
       if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0)
        error (_("Error starting executable via shell: %d"), errno);
 #ifdef __USEWIDE