Why n throws error? Error: sudo required (or change ownership, or define N_PREFIX)

Viewed 19813

I want to install latest Node.js version

n latest

  installing : node-v14.2.0
       mkdir : /usr/local/n/versions/node/14.2.0
mkdir: cannot create directory ‘/usr/local/n’: Permission denied

  Error: sudo required (or change ownership, or define N_PREFIX)

Something is wrong with ownership. I tried to fix this

sudo chown -R $(whoami) /usr/local/n

Same error again.

n latest
cp: cannot create directory '/usr/local/lib/node_modules': Permission denied
cp: cannot create regular file '/usr/local/bin/node': Permission denied
cp: cannot create symbolic link '/usr/local/bin/npm': Permission denied
cp: cannot create symbolic link '/usr/local/bin/npx': Permission denied

Permissions in n

/usr/local/n$ ll
total 12
drwxrwxr-x  3 miki root 4096 мај  8 13:29 ./
drwxr-xr-x 11 root root 4096 мај  8 13:29 ../
drwxrwxr-x  3 miki miki 4096 мај  8 13:29 versions/

SOLVED

sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share
3 Answers

Context

n command downloads and installs to /usr/local by default, creating the /usr/local/n folder with these permissions by default:

drwxr-xr-x root  wheel  .
drwxr-xr-x root  wheel  ..
drwxr-xr-x root  wheel  versions

Possible solutions

A. Add yourself to the group and grant write permission (safer):

  1. Add yourself to the wheel group.

    1.1 macOS:

     sudo dseditgroup -o edit -a $(whoami) -t user wheel
    

    1.2 GNU/Linux:

     sudo usermod -a -G wheel $(whoami)
    
  2. Allow wheel members writing permission on that folder:

     sudo chmod -R g+w /usr/local/n/
    

B. Change ownership directly to your user (quicker):

You would need to change where n stores node versions ownership:

sudo mkdir -p /usr/local/n && sudo chown -R $(whoami) /usr/local/n/

C. Change the folder where n saves node binaries, etc.

The n command downloads and installs to /usr/local by default, but you may override this location by defining N_PREFIX.

Source: https://github.com/tj/n#optional-environment-variables

  1. Create a folder, ie: $HOME/.n

     mkdir $HOME/.n
    
  2. Define the environment variable N_PREFIX adding to your shell initialisation file this line:

    2.1. bash (~/.bashrc) or zsh (~/.zshrc):

     export N_PREFIX=$HOME/.n
    

    2.2. fish (~/.config/fish/config.fish):

     set -x N_PREFIX $HOME/.n
    
  3. Add the new binary path to your environment's $PATH:

    3.1. bash/zsh:

     export PATH=$N_PREFIX/bin:$PATH
    

    3.2. fish:

     set -x PATH $N_PREFIX/bin:$PATH
    

you just need to define the N_PREFIX.

  • First create the folder where the n data will be saved

    mkdir $HOME/.n

  • then export the N_PREFIX in your .bashrc file

    export N_PREFIX=$HOME/.n

if you use fishshell, add this to your .config.fish file: set -x N_PREFIX $HOME/.n

Related