Skip to content

Instantly share code, notes, and snippets.

@ryin
Last active May 27, 2025 08:36
Show Gist options
  • Select an option

  • Save ryin/3106801 to your computer and use it in GitHub Desktop.

Select an option

Save ryin/3106801 to your computer and use it in GitHub Desktop.
bash script for installing tmux without root access
#!/bin/bash
# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.
# exit on error
set -e
TMUX_VERSION=1.8
# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp
# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz http://sourceforge.net/projects/tmux/files/tmux/tmux-${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz/download
wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz
# extract files, configure, and compile
############
# libevent #
############
tar xvzf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..
############
# ncurses #
############
tar xvzf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/local
make
make install
cd ..
############
# tmux #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..
# cleanup
rm -rf $HOME/tmux_tmp
echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."
@eva-n27

eva-n27 commented Oct 11, 2017

Copy link
Copy Markdown

I use script of @yogeshpv, and it works now.
Thanks all of you.

@thinki

thinki commented Oct 16, 2017

Copy link
Copy Markdown

@smilesun
Compile error is caused by GCC Version equaling 5.X which is too higher.
https://dev.openwrt.org/ticket/19749

Modify ncurses source code as below:

--- a/meta/recipes-core/ncurses/ncurses.inc
+++ b/meta/recipes-core/ncurses/ncurses.inc
@@ -26,7 +26,7 @@ ENABLE_WIDEC ?= "true"
 # _GNU_SOURCE is required for widec stuff and is detected automatically
 # for target objects.  But it must be set manually for native and sdk
 # builds.
-BUILD_CPPFLAGS += "-D_GNU_SOURCE"
+BUILD_CPPFLAGS += "-D_GNU_SOURCE -P"

 # natives don't generally look in base_libdir
 base_libdir_class-native = "${libdir}"

@parth126

Copy link
Copy Markdown

Thanks a lot mate. You are a life saver.

@d3v-null

d3v-null commented Feb 9, 2018

Copy link
Copy Markdown

Hey there, I tried to run this but https://sourceforge.net/projects/tmux/files/tmux/tmux-1.8/tmux-1.8.tar.gz/download is 404'ing for me :(
And then when I search for tmux on SourceForge, the project doesn't exist: https://sourceforge.net/directory/os:linux/?q=tmux
Any ideas?
EDIT: Solution is in @ZhouYL0213 's comment

@mukahraman

Copy link
Copy Markdown

Just updated the links and it is working perfectly. Thanks a lot for saving a lot of my time!

@hmm34

hmm34 commented Mar 29, 2018

Copy link
Copy Markdown

I used the solution in @yogeshpv 's comment. It worked with only one modification: cd to new version of ncurses (as of right now it is ncurses-6.1). Thanks!

@congyh

congyh commented Jun 12, 2018

Copy link
Copy Markdown

Thank you so much!

@YoungForest

Copy link
Copy Markdown
#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.5

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz 
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz 
wget http://invisible-island.net/datafiles/release/ncurses.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses.tar.gz
cd ncurses-6.1
./configure --prefix=$HOME/local
make
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

thanks @yogeshpv and @hmm34 's comments.

@musically-ut

musically-ut commented Aug 16, 2018

Copy link
Copy Markdown

The links to libevent and ncurses redirect and wget tries to save them with a different filename.

Have fixed them (i.e. hardcoded) to the correct filenames. Also, bumped tmux version from 2.5 to 2.7.

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.7

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz 
wget -O libevent-2.1.8-stable.tar.gz https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz 
wget -O ncurses.tar.gz http://invisible-island.net/datafiles/release/ncurses.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses.tar.gz
cd ncurses-6.1
./configure --prefix=$HOME/local
make
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

@danellecline

Copy link
Copy Markdown

Thanks @musically-ut . Your fixes worked for me.

@jdhao

jdhao commented Oct 25, 2018

Copy link
Copy Markdown

@musically-ut, I see that you put some include dir for LDFLAGS. AFAIK, the LDFLAGS are for library files, not header files. Is there anything that I am missing here? Or because Tmux is different in that it requires us to do so? It seems I can not find some official guide.

@abalhomaid

Copy link
Copy Markdown

@musically-ut script works. Thanks a lot!

@StevenShi-23

Copy link
Copy Markdown

To use the latest tmux release v2.8, the following works for me (notice you need to do autogen.sh before using ./configure, and use make -j can speed up the build process):

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.8

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/archive/${TMUX_VERSION}.tar.gz 
wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=$HOME/local --disable-shared
make -j
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/local
make -j
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./autogen.sh
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

@JoyHuYY1412

Copy link
Copy Markdown

Everything is right But when I runtmux
it says -bash: tmux: command not found
what can I do ?

@todeschini-felipe

todeschini-felipe commented Jan 8, 2019

Copy link
Copy Markdown

@StevenShi-23 script is breaking in
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make

with
make: *** No rule to make target 'compat/forkpty-linux.c', needed by 'compat/forkpty-linux.o'. Stop.

I am using CentOS 6.10. Any ideas?

@amlestin

amlestin commented Jan 15, 2019

Copy link
Copy Markdown

To use the latest tmux release v2.8, the following works for me (notice you need to do autogen.sh before using ./configure, and use make -j can speed up the build process):

#!/bin/bash

# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.8

# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download source files for tmux, libevent, and ncurses
wget -O tmux-${TMUX_VERSION}.tar.gz https://github.com/tmux/tmux/archive/${TMUX_VERSION}.tar.gz 
wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz

# extract files, configure, and compile

############
# libevent #
############
tar xvzf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=$HOME/local --disable-shared
make -j
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=$HOME/local
make -j
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./autogen.sh
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

Thanks for the help. This worked for me on Red Hat Enterprise Linux Server release 6.9 (Santiago).

My ~/.bashrc also contains export PATH="$PATH:$HOME/local/bin" to make tmux accessible everywhere.

@hypan599

Copy link
Copy Markdown

Just updated links of latest tmux and it worked perfectly. Thanks!

@zeeshansayyed

Copy link
Copy Markdown

Thank you @mnsmar

@hoosierEE

Copy link
Copy Markdown

The above from @StevenShi-23 and @amlestin (including the part about adding to $PATH) worked for me on Centos 7.6. Thanks!

@acanakoglu

Copy link
Copy Markdown

I updated for 2.9a.


# Script for installing tmux on systems where you don't have root access.
# tmux will be installed in $HOME/local/bin.
# It's assumed that wget and a C/C++ compiler are installed.

# exit on error
set -e

TMUX_VERSION=2.9a
LIBEVENT_VERSION=2.1.8-stable
NCURSES_VERSION=6.1


# create our directories
mkdir -p $HOME/local $HOME/tmux_tmp
cd $HOME/tmux_tmp

# download all the files
wget https://github.com/tmux/tmux/releases/download/${TMUX_VERSION}/tmux-${TMUX_VERSION}.tar.gz
wget https://github.com/libevent/libevent/releases/download/release-${LIBEVENT_VERSION}/libevent-${LIBEVENT_VERSION}.tar.gz
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-${NCURSES_VERSION}.tar.gz

############
# libevent #
############
tar xvzf libevent-${LIBEVENT_VERSION}.tar.gz
cd libevent-${LIBEVENT_VERSION}
./configure --prefix=$HOME/local --disable-shared
make
make install
cd ..

############
# ncurses  #
############
tar xvzf ncurses-${NCURSES_VERSION}.tar.gz
cd ncurses-${NCURSES_VERSION}
./configure --prefix=$HOME/local
make 
make install
cd ..

############
# tmux     #
############
tar xvzf tmux-${TMUX_VERSION}.tar.gz
cd tmux-${TMUX_VERSION}
./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include"
CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make
cp tmux $HOME/local/bin
cd ..

cd $HOME

# cleanup
rm -rf $HOME/tmux_tmp

echo "$HOME/local/bin/tmux is now available. You can optionally add $HOME/local/bin to your PATH."

# for the in order to add to the .bashrc (for /sh/bash) comment-in below line
# echo 'export PATH="$HOME/local/bin:$PATH"' >> $HOME/.bashrc

@flakrat

flakrat commented Nov 4, 2019

Copy link
Copy Markdown

Curious, why not use make install after compiling Tmux rather than cp tmux $HOME/local/bin?

Not a big difference, but you are missing the man page:

make[1]: Entering directory `/home/flakrat/sources/tmux-2.9a'
 /usr/bin/mkdir -p '/home/flakrat/local/bin'
  /usr/bin/install -c tmux '/home/flakrat/local/bin'
make  install-exec-hook
make[2]: Entering directory `/home/flakrat/sources/tmux-2.9a'
if test xmdoc = xmdoc; then \
	sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1 \
		>./tmux.1.mdoc; \
else \
	sed -e "s|@SYSCONFDIR@|/etc|g" ./tmux.1| \
		gawk -f ./mdoc2man.awk >./tmux.1.man; \
fi
/usr/bin/mkdir -p /home/flakrat/local/share/man/man1
/usr/bin/install -c -m 644 ./tmux.1.mdoc \
	/home/flakrat/local/share/man/man1/tmux.1

@jrwrigh

jrwrigh commented Mar 26, 2020

Copy link
Copy Markdown

Note: The latest version of tmux (3.0a) is distributed as an Appimage. So you can simply download the Appimage and either:

  1. Put the Appimage somewhere on your path (and thus call tmux.Appimage directly) or
  2. Extract out the Appimage. This may be necessary depending on whether your machine can directly run Appimages.

@Derryxu

Derryxu commented May 21, 2021

Copy link
Copy Markdown

Thank you so much!

@Zemke

Zemke commented May 29, 2021

Copy link
Copy Markdown

For anyone looking to do this for Windows. Installing Tmux in Git Bash for instance without admin privileges.

You can grab the file from https://packages.msys2.org/package/tmux?repo=msys&variant=x86_64 and it contains tmux.exe along with appendices.

https://github.com/msys2/MSYS2-packages/blob/master/tmux/PKGBUILD is how they build it.

@nodswal

nodswal commented Jan 24, 2022

Copy link
Copy Markdown

Wow this is an older version of my build script, I will have to look through the commits for suggestions
https://github.com/nodswal/tmux-install

@davehouser1

davehouser1 commented Nov 9, 2022

Copy link
Copy Markdown

@StevenShi-23 script is breaking in CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib" make

with make: *** No rule to make target 'compat/forkpty-linux.c', needed by 'compat/forkpty-linux.o'. Stop.

I am using CentOS 6.10. Any ideas?

Any solution to this? I know CentOS6.10 is ancient but that is the version @StevenShi-23 and I are using. Is this only a problem on older distros? tmux refuses to to continue to compile with this error:

$ ./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include" CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses" LDFLAGS="-static -L$HOME/local/include -L$HOME/local/include/ncurses -L$HOME/local/lib"
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/home/dh016d/tmux/packages_downloaded/tmux-2.2':
configure: error: C compiler cannot create executables
See `config.log' for more details

I can get past it if I just run

./configure CFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses -I$HOME/local/include/event2" LDFLAGS="-L$HOME/local/lib -L$HOME/local/include/ncurses -L$HOME/local/include -L$HOME/local/include/event2" CPPFLAGS="-I$HOME/local/include -I$HOME/local/include/ncurses -I$HOME/local/include/event2"

However after I make tmux throws this error:

$tmux -V
./tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
$ldd ./tmux
        linux-vdso.so.1 =>  (0x00007ffca26e0000)
        libutil.so.1 => /lib64/libutil.so.1 (0x0000003b71e00000)
        libevent-2.0.so.5 => not found
        librt.so.1 => /lib64/librt.so.1 (0x0000003b68600000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003b69200000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003b67600000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b67e00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000561f0752f000)

configure refuses to link the library for libevent, I cant figure out why. Anyone know?

EDIT: Got it working, followed this post here.

Steps to fix. Do not compile the way the script as above, do the following after you untar tmux and go into the directory.

export DIR="$HOME/local"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR/lib
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
make
make install

One more note, all the posts about using autogen.sh, that did not work for me because aclocal was not installed. To avoid having to install autogen and autoconf I just downloaded the release version from here

https://github.com/tmux/tmux/releases/download/2.2/tmux-2.2.tar.gz

Change the version to what you want, like this. The configure script should be inside so you dont need to use autogen

https://github.com/tmux/tmux/releases/download/2.8/tmux-2.8.tar.gz

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment