diff --git a/cbits/posix/posix_spawn.c b/cbits/posix/posix_spawn.c
--- a/cbits/posix/posix_spawn.c
+++ b/cbits/posix/posix_spawn.c
@@ -42,10 +42,15 @@
         return 0;
 
     case STD_HANDLE_USE_FD:
-        if (posix_spawn_file_actions_adddup2(fa, hdl->use_fd, fd) != 0) {
-            *failed_doing = "posix_spawn_file_actions_adddup2";
-            return -1;
-        }
+        // N.B. POSIX specifies that dup2(x,x) should be a no-op, but
+        // naturally Apple ignores this and rather fails in posix_spawn on Big
+        // Sur.
+        if (hdl->use_fd != fd) {
+            if (posix_spawn_file_actions_adddup2(fa, hdl->use_fd, fd) != 0) {
+                *failed_doing = "posix_spawn_file_actions_adddup2";
+                return -1;
+            }
+       }
         return 0;
 
     case STD_HANDLE_USE_PIPE:
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
 # Changelog for [`process` package](http://hackage.haskell.org/package/process)
 
+## 1.6.13.2 *July 2021*
+
+* `posix_spawn`: Don't attempt to `dup2` identical fds [#214](https://github.com/haskell/process/pull/214)
+
 ## 1.6.13.1 *July 2021*
 
 * Patches for the previous release
diff --git a/process.cabal b/process.cabal
--- a/process.cabal
+++ b/process.cabal
@@ -1,5 +1,5 @@
 name:          process
-version:       1.6.13.1
+version:       1.6.13.2
 -- NOTE: Don't forget to update ./changelog.md
 license:       BSD3
 license-file:  LICENSE
