Skip to content

use nix breaks mktemp with Nix 2.24+ on macOS #1345

@gaverhae

Description

@gaverhae

Describe the bug

With a recent version of Nix (tested 2.24.9 and 2.24.10; this bug was not present with 2.18.7), mktemp fails with an error message along the lines of:

$ mktemp
mktemp: failed to create file via template ‘/private/tmp/nix-shell-61712-0/tmp.XXXXXXXXXX’: No such file or directory
$

To Reproduce

(starting from a directory not managed by direnv/nix)

$ cd $(mktemp -d)
$ cat > shell.nix <<'EOF'
let
  spec = { branch = "nixpkgs-unstable";
           repo = "nixpkgs";
           owner = "NixOS";
           commit = "8c4dc69b9732f6bbe826b5fbb32184987520ff26";
           sha = "1x9qqhvk2d3139v9szw0pj7563v4bkj19a7vd5z8miaih700fbfr"; };
  pkgs = import (builtins.fetchTarball {
          url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.commit}.tar.gz";
          sha256 = spec.sha;
          }) {};
in
pkgs.mkShell {
  buildInputs = with pkgs; [
    bash
  ];
}
EOF
$ cat > .envrc <<'EOF'
use nix
EOF
direnv: error /private/var/folders/t8/rqf91gfx4f77klq09d1ptl9h0000gn/T/tmp.NTVW7lX5Dz/.envrc is blocked. Run `direnv allow` to approve its content
$ direnv --version
2.35.0
$ nix --version
nix (Nix) 2.24.10
$ nix-shell shell.nix --run mktemp
/private/tmp/nix-shell-62715-0/tmp.1ADoSdV0BH
$ nix-shell shell.nix --run 'echo $TMPDIR $TEMPDIR $TMP'
/private/tmp/nix-shell-62725-0 /private/tmp/nix-shell-62725-0 /private/tmp/nix-shell-62725-0
$ nix-shell shell.nix --run 'ls $TMPDIR; ls $TEMPDIR; ls $TMP'
env-vars  rc
env-vars  rc
env-vars  rc
$ direnv allow
direnv: loading /private/var/folders/t8/rqf91gfx4f77klq09d1ptl9h0000gn/T/tmp.NTVW7lX5Dz/.envrc
direnv: using nix
direnv: export +AR +AS +CC +CONFIG_SHELL +CXX +DEVELOPER_DIR +HOST_PATH +IN_NIX_SHELL +LD +LD_DYLD_PATH +MACOSX_DEPLOYMENT_TARGET +NIX_APPLE_SDK_VERSION +NIX_BINTOOLS +NIX_BINTOOLS_WRAPPER_TARGET_HOST_aarch64_apple_darwin +NIX_BUILD_CORES +NIX_BUILD_TOP +NIX_CC +NIX_CC_WRAPPER_TARGET_HOST_aarch64_apple_darwin +NIX_CFLAGS_COMPILE +NIX_DONT_SET_RPATH +NIX_DONT_SET_RPATH_FOR_BUILD +NIX_DONT_SET_RPATH_FOR_TARGET +NIX_ENFORCE_NO_NATIVE +NIX_HARDENING_ENABLE +NIX_IGNORE_LD_THROUGH_GCC +NIX_LDFLAGS +NIX_NO_SELF_RPATH +NIX_STORE +NM +OBJCOPY +OBJDUMP +PATH_LOCALE +RANLIB +SDKROOT +SIZE +SOURCE_DATE_EPOCH +STRINGS +STRIP +TEMP +TEMPDIR +TMP +ZERO_AR_DATE +__darwinAllowLocalNetworking +__impureHostDeps +__propagatedImpureHostDeps +__propagatedSandboxProfile +__sandboxProfile +__structuredAttrs +buildInputs +buildPhase +builder +cmakeFlags +configureFlags +depsBuildBuild +depsBuildBuildPropagated +depsBuildTarget +depsBuildTargetPropagated +depsHostHost +depsHostHostPropagated +depsTargetTarget +depsTargetTargetPropagated +doCheck +doInstallCheck +mesonFlags +name +nativeBuildInputs +out +outputs +patches +phases +preferLocalBuild +propagatedBuildInputs +propagatedNativeBuildInputs +shell +shellHook +stdenv +strictDeps +system ~PATH ~TMPDIR
$ echo $TMPDIR $TEMPDIR $TMP
/private/tmp/nix-shell-62759-0 /private/tmp/nix-shell-62759-0 /private/tmp/nix-shell-62759-0
$ ls $TMPDIR; ls $TEMPDIR; ls $TMP
ls: cannot access '/private/tmp/nix-shell-62759-0': No such file or directory
ls: cannot access '/private/tmp/nix-shell-62759-0': No such file or directory
ls: cannot access '/private/tmp/nix-shell-62759-0': No such file or directory
$ mktemp
mktemp: failed to create file via template ‘/private/tmp/nix-shell-62759-0/tmp.XXXXXXXXXX’: No such file or directory
$ direnv deny
$ mktemp
/var/folders/t8/rqf91gfx4f77klq09d1ptl9h0000gn/T/tmp.q83tiTrY1f
$ nix-shell shell.nix --run mktemp
/private/tmp/nix-shell-62784-0/tmp.GXb9jSDon8
$

Expected behavior

With an older version of Nix, this works as expected:

$ cd $(mktemp -d)
$ cat > shell.nix <<'EOF'
let
  spec = { branch = "nixpkgs-unstable";
           repo = "nixpkgs";
           owner = "NixOS";
           commit = "8c4dc69b9732f6bbe826b5fbb32184987520ff26";
           sha = "1x9qqhvk2d3139v9szw0pj7563v4bkj19a7vd5z8miaih700fbfr"; };
  pkgs = import (builtins.fetchTarball {
          url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.commit}.tar.gz";
          sha256 = spec.sha;
          }) {};
in
pkgs.mkShell {
  buildInputs = with pkgs; [
    bash
  ];
}
EOF
$ cat > .envrc <<'EOF'
use nix
EOF
direnv: error /private/var/folders/t8/rqf91gfx4f77klq09d1ptl9h0000gn/T/tmp.dgCFVZytQT/.envrc is blocked. Run `direnv allow` to approve its content
$ direnv --version
2.35.0
$ nix --version
nix (Nix) 2.10.3
$ nix-shell shell.nix --run mktemp
/tmp/tmp.rw2a5IeTjH
$ nix-shell shell.nix --run 'echo $TMPDIR $TEMPDIR $TMP'
/tmp /tmp /tmp
$ direnv allow
direnv: loading /private/var/folders/t8/rqf91gfx4f77klq09d1ptl9h0000gn/T/tmp.dgCFVZytQT/.envrc
direnv: using nix
direnv: export +AR +AS +CC +CONFIG_SHELL +CXX +DEVELOPER_DIR +HOST_PATH +IN_NIX_SHELL +LD +LD_DYLD_PATH +MACOSX_DEPLOYMENT_TARGET +NIX_APPLE_SDK_VERSION +NIX_BINTOOLS +NIX_BINTOOLS_WRAPPER_TARGET_HOST_aarch64_apple_darwin +NIX_BUILD_CORES +NIX_BUILD_TOP +NIX_CC +NIX_CC_WRAPPER_TARGET_HOST_aarch64_apple_darwin +NIX_CFLAGS_COMPILE +NIX_DONT_SET_RPATH +NIX_DONT_SET_RPATH_FOR_BUILD +NIX_DONT_SET_RPATH_FOR_TARGET +NIX_ENFORCE_NO_NATIVE +NIX_HARDENING_ENABLE +NIX_IGNORE_LD_THROUGH_GCC +NIX_LDFLAGS +NIX_NO_SELF_RPATH +NIX_STORE +NM +OBJCOPY +OBJDUMP +PATH_LOCALE +RANLIB +SDKROOT +SIZE +SOURCE_DATE_EPOCH +STRINGS +STRIP +TEMP +TEMPDIR +TMP +ZERO_AR_DATE +__darwinAllowLocalNetworking +__impureHostDeps +__propagatedImpureHostDeps +__propagatedSandboxProfile +__sandboxProfile +__structuredAttrs +buildInputs +buildPhase +builder +cmakeFlags +configureFlags +depsBuildBuild +depsBuildBuildPropagated +depsBuildTarget +depsBuildTargetPropagated +depsHostHost +depsHostHostPropagated +depsTargetTarget +depsTargetTargetPropagated +doCheck +doInstallCheck +mesonFlags +name +nativeBuildInputs +out +outputs +patches +phases +preferLocalBuild +propagatedBuildInputs +propagatedNativeBuildInputs +shell +shellHook +stdenv +strictDeps +system ~PATH ~TMPDIR
$ echo $TMPDIR $TEMPDIR $TMP
/tmp /tmp /tmp
$ mktemp
/tmp/tmp.lVCgP34gjc
$ direnv deny
$ mktemp
/var/folders/t8/rqf91gfx4f77klq09d1ptl9h0000gn/T/tmp.zDAlIMIktl
$ nix-shell shell.nix --run mktemp
/tmp/tmp.po0HhxIZF9
$

Environment

  • OS: macOS
    $ sw_vers
    ProductName:            macOS
    ProductVersion:         15.1
    BuildVersion:           24B83
    $
  • Shell: zsh
    $ zsh --version
    zsh 5.9 (arm-apple-darwin23.0.0)
    $
  • Direnv version 2.35.0

Additional context

This is likely due to nix-shell cleaning up after itself, which seems to be new behaviour:

$ cd $(mktemp -d)
$ cat > shell.nix <<'EOF'
let
  spec = { branch = "nixpkgs-unstable";
           repo = "nixpkgs";
           owner = "NixOS";
           commit = "8c4dc69b9732f6bbe826b5fbb32184987520ff26";
           sha = "1x9qqhvk2d3139v9szw0pj7563v4bkj19a7vd5z8miaih700fbfr"; };
  pkgs = import (builtins.fetchTarball {
          url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.commit}.tar.gz";
          sha256 = spec.sha;
          }) {};
in
pkgs.mkShell {
  buildInputs = with pkgs; [
    bash
  ];
}
EOF
$ nix-shell shell.nix --run 'echo $TMPDIR'
/private/tmp/nix-shell-63269-0
$ ls /private/tmp/nix-shell-63269-0
ls: cannot access '/private/tmp/nix-shell-63269-0': No such file or directory
$

As a temporary workaround, this seems to work in .envrc:

use nix
mkdir -p $TMPDIR

but I'm not familiar enough with Nix or direnv to know whether that's a "good" fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions