diff --git a/IPython/utils/path.py b/IPython/utils/path.py
index 95d05ef..82175ae 100644
--- a/IPython/utils/path.py
+++ b/IPython/utils/path.py
@@ -356,6 +356,13 @@ def expand_path(s):
     return s
 
 
+def unescape_glob(string):
+    """Unescape glob pattern in `string`."""
+    for pattern in '*[]!?':
+        string = string.replace(r'\{0}'.format(pattern), pattern)
+    return string
+
+
 def shellglob(args):
     """
     Do glob expansion for each element in `args` and return a flattened list.
@@ -365,7 +372,7 @@ def shellglob(args):
     """
     expanded = []
     for a in args:
-        expanded.extend(glob.glob(a) or [a])
+        expanded.extend(glob.glob(a) or [unescape_glob(a)])
     return expanded
 
 
diff --git a/IPython/utils/tests/test_path.py b/IPython/utils/tests/test_path.py
index 71a2896..f44b1a6 100644
--- a/IPython/utils/tests/test_path.py
+++ b/IPython/utils/tests/test_path.py
@@ -475,5 +475,14 @@ def test_shellglob():
                          + filenames_start_with_a
                          + filenames_end_with_b
                          + ['*c'])
+
+            assert_match([r'\*'], ['*'])
+            assert_match([r'a\*', 'a*'], ['a*'] + filenames_start_with_a)
+            assert_match(['a[012]'], filenames_start_with_a)
+            assert_match([r'a\[012]'], ['a[012]'])
         finally:
             os.chdir(save)
+
+
+def test_unescape_glob():
+    nt.assert_equals(path.unescape_glob(r'\*\[\!\]\?'), '*[!]?')