diff -r 95d1adf144ee Doc/library/shutil.rst --- a/Doc/library/shutil.rst Sat Nov 03 14:37:37 2012 +0200 +++ b/Doc/library/shutil.rst Sat Nov 03 16:02:00 2012 +0200 @@ -353,6 +353,14 @@ .. versionadded:: 3.3 +.. function :: get_default_shell_path() + + Return the path to default shell. + + For unix system returns path to `sh`, for windows returns path to `cmd.exe`. + + .. versionadded:: 3.4 + .. exception:: Error This exception collects exceptions that are raised during a multi-file diff -r 95d1adf144ee Lib/shutil.py --- a/Lib/shutil.py Sat Nov 03 14:37:37 2012 +0200 +++ b/Lib/shutil.py Sat Nov 03 16:02:00 2012 +0200 @@ -1106,3 +1106,11 @@ if _access_check(name, mode): return name return None + + +def get_default_shell_path(): + """Return the path to default shell.""" + if sys.platform == "win32": + return which('cmd.exe') + else: + return which('sh') diff -r 95d1adf144ee Lib/test/test_shutil.py --- a/Lib/test/test_shutil.py Sat Nov 03 14:37:37 2012 +0200 +++ b/Lib/test/test_shutil.py Sat Nov 03 16:02:00 2012 +0200 @@ -1622,9 +1622,27 @@ self.assertEqual(expected, actual) +class TestGetDefaultShellPath(unittest.TestCase): + def test_get_default_shell_path(self): + shell = shutil.get_default_shell_path() + param = "/c" if sys.platform == 'win32' else "-c" + s = subprocess.Popen([shell, param, "echo test"], + stdout=subprocess.PIPE) + stdout, stderr = s.communicate() + self.assertIn(b"test", stdout) + self.assertIsNone(stderr) + self.assertEqual(0, s.returncode) + + def test_main(): - support.run_unittest(TestShutil, TestMove, TestCopyFile, - TermsizeTests, TestWhich) + support.run_unittest( + TestShutil, + TestMove, + TestCopyFile, + TermsizeTests, + TestWhich, + TestGetDefaultShellPath, + ) if __name__ == '__main__': test_main()