Bagaimana saya bisa mengatur shell default saya untuk memulai tmux

79

Saya ingin bash shell default saya untuk langsung masuk ke tmux daripada saya selalu harus mengetik tmux setiap kali.

Michael Durrant
sumber

Jawaban:

46

Ini sepertinya berhasil ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

Cukup tambahkan baris kode bash berikut ke .bashrc Anda sebelum alias Anda; kode untuk shell lain sangat mirip:

[[ $TERM != "screen" ]] && exec tmux
StarNamer
sumber
2
Bagi saya ini juga diperlukan [[ $- != *i* ]] && returnuntuk tidak menjadi loop tak terbatas (dari halaman yang sama)
Keith Smiley
5
Ini adalah solusi buruk karena TERMmungkin diatur ke beberapa nilai lain oleh file pengguna .tmux.conf. Lebih baik untuk memeriksa apakah TMUXvariabel diatur atau tidak.
Kusalananda
104

Jawaban @ StarNamer umumnya akurat, meskipun saya biasanya menyertakan tes berikut untuk memastikan bahwa (1) tmux ada pada sistem, (2) kami berada di shell interaktif, dan (3) tmux tidak mencoba berjalan di dalam diri:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Referensi

pengguna7089
sumber
1
Bagus, saya perlu commandsebelumnya tetapi tidak menyadari itu ada.
Freedom_Ben
2
ini execpernyataan tidak membiarkan Anda keluar tmux tanpa berhenti seluruh terminal! : |
Louis Maddox
5
@LouisMaddox: execmenggantikan proses saat ini dengan yang baru - dalam hal ini, ia menggantikan shell bash login dengan tmux, jadi ketika tmux keluar maka tidak ada terminal lain untuk kembali ke :)
Mark K Cowan
1
@ rjt Benar, ini memulai sesi baru dengan desain. Jika Anda lebih suka melampirkan ke sesi tmux yang ada cukup ganti exec tmuxdengan rasa pilihan Andatmux attach
user7089
2
bukannya exec tmuxsaya gunakan exec tmux new-session -A -s mainjadi saya akan selalu memiliki sesi yang disebut main dan lampirkan (bukannya membuat yang baru setiap kali saya terhubung ke mesin jarak jauh saya) tetapi itu tidak akan crash seperti menggunakan tmux attachjika tidak ada sesi yang tersedia (ditemukan di sini: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid
16

Menambahkan garis seperti

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

di file bashrc Anda mungkin akan melakukan pekerjaan itu. Perhatikan baris ini akan keluar ssh dan mengakhiri koneksi setelah Anda melepaskan atau keluar dari tmux. Saya suka konfigurasi ini karena menghemat stroke kunci untuk mengakhiri koneksi. Tetapi jika Anda tidak menyukai ini (yang saya pikir sangat tidak mungkin) dan lebih suka tetap berada di shell login setelah penghentian, cukup hapus exitbagian:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

Perhatikan juga Anda tidak harus membungkus tmux attachdengan exec, karena hal ini akan menyebabkan koneksi akan ditutup jika tidak ada sesi tmux untuk melampirkan.

huangzonghao
sumber
Saya telah menambahkan baris ini ke .bashrc saya, tetapi sekarang ketika saya memulai terminal, saya mendapatkan beberapa pesan: /home/z/.tmux.conf:10: tidak ada sesi saat ini (pesan berulang untuk baris 11, 13, 14 , 15). Baris-baris itu adalah hal-hal seperti "set default-command" exec bash "" dan "set default-terminal" screen-256color ".
Matt G
@MattG Merasa seperti ada yang salah dengan file konfigurasi tmux.
huangzonghao
5

Ada perintah chshyang mengubah shell login. Konsultasikan man chsh.

paul
sumber
6
tmuxbukan shell, ini adalah terminal multiplexer seperti layar GNU. Menariknya, ia mendukung -copsi sesuai dengan halaman manual , jadi itu dapat berfungsi seperti sebuah shell cukup untuk menggunakannya sebagai shell login Anda, tetapi saya menduga itu tidak akan berfungsi dengan baik dalam semua situasi, misalnya login grafis melalui gdm / kdm .
Mikel
1
Meskipun ini masuk akal dan didukung oleh dokumentasi, tampaknya memecah eksekusi perintah langsung melalui SSH (sesuatu seperti ssh $some_server echo foo).
n.st
3
tmux pada setidaknya 1,8 pada Ubuntu menambahkan sendiri /etc/shells, jadi itu adalah shell login yang valid.
claytron
2
Ini mengharuskan Anda mengkonfigurasi default-shellpengaturan dalam konfigurasi tmux untuk menunjuk ke shell yang sebenarnya.
Kusalananda
4

Saya berhasil menggunakan

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

di saya .zshrc. Jika Anda menggunakan bash, letakkan di bash Anda .bashrc.


Saya juga baru saja mencoba menetapkan tmuxsebagai shell default saya ( chsh -s $(which tmux)) dan tampaknya memecah eksekusi perintah langsung melalui SSH, misalnya ssh $some_server echo footidak akan menghasilkan output apa pun.

n.st
sumber
3

Pergi ke preferensi terminal. masukkan deskripsi gambar di sini

Dan kemudian klik ke "command" bar. masukkan deskripsi gambar di sini

Periksa "Jalankan perintah khusus, bukan penjualan saya" dan tulis perintah apa pun yang ingin Anda jalankan pada permulaan terminal Anda.

pengguna174935
sumber
1

Tidak ada respons di atas yang berfungsi untuk saya - exec tmuxmencegah saya menutup tmux tanpa keluar dari shell (apakah dibuka dengan Ctrl+ Tatau dari menu aplikasi).

Saya menggunakan Linux Mint, yang memungkinkan Anda memetakan hotkeys tertentu ke perintah, dan (tidak-halal seperti mungkin untuk beberapa ..) Saya punya shell bash dengan perintah yang dimulai di sana, misalnya Win+ Alt+ Bmelakukan semacam bash -exec(vim)pernyataan berbelit-belit untuk edit .bashrc saya, jadi ini berfungsi seperti shell biasa.

tmux dimuat daripada vim dalam situasi itu setelah menempatkan di atas di bagian atas saya .bashrc. Saya telah menggunakan tmux executing line di if if statement lainnya, memeriksa apakah tmux berjalan dalam mode interaktif.

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

Anda bisa membungkus semua itu menjadi satu baris tetapi untuk keterbacaan saya pikir itu baik-baik saja.

Louis Maddox
sumber
Menambahkan ampersand akan menyelesaikan masalah itu seperti itu. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau
1

Menambahkan ke jawaban @Louis Maddox, saya akan menjalankan bagian tmux dengan;

(exec tmux attach || exec tmux new-session)
devrimbaris
sumber
Saya menggunakan exec sh -c 'tmux a || tmux', yang (setelah melihat jawaban Anda) mungkin akan membuat hal-hal buruk terjadi jika tmux tidak dapat memulai karena alasan apa pun ..... terima kasih, saya akan menggunakan milik Anda mulai sekarang :)
Mark K Cowan
1
tmux new -A -s mysessionmungkin akan bekerja juga.
poolie
1

Ini di ~/.profile(saya menggunakan ksh93) saya:

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

Jika TMUXvariabel lingkungan tidak disetel / kosong, maka kita belum berada di sesi tmux, jadi ...

Jika tmux has-sessionkembali dengan status keluar nol (benar), ada sesi yang tersedia untuk dilampirkan. Pasang itu.

Jika tidak, buat sesi baru.

Dimungkinkan juga untuk digunakan tmuxsebagai shell login Anda. Namun, jika Anda melakukan ini, pastikan untuk mengatur default-shellke shell aktual di ~/.tmux.conffile Anda (lihat manual tmux untuk info lebih lanjut tentang ini).

Kusalananda
sumber
1

Anda bisa (dan seperti yang sekarang mungkin harus) menggunakan chshperintah untuk mengatur tmux sebagai shell default, kemudian tambahkan yang berikut ke .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Ingatlah untuk memodifikasi jalur di akhir baris.

Błażej Michalik
sumber
1

Saya menggabungkan pemeriksaan ekstensif, dengan pemeriksaan sesi bersyarat, dan menempatkan putaran saya sendiri di atasnya, untuk membuat sesi default yang terhubung atau dibuat. Kecuali Anda berada di dalam sesi tmux lain, atau kondisi perlindungan lainnya terpenuhi.

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

Berdasarkan jawaban ini:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110

yosefrow
sumber
0

Tambahkan ini ke dalam ~/.tmux.conf

set -g default-command /usr/local/bin/fish
IanVaughan
sumber
1
Saya pikir Anda salah paham soal mate! ;)
PhilT
-3

Sebagai Mikel sudah menyatakan dalam komentarnya untuk memiliki tmux sebagai shell login Anda dapat memiliki efek samping. Tetapi Anda dapat membuat tmuxshell default Anda, secara harfiah. Shell default pengguna didefinisikan di / etc / passwd. Jadi Anda bisa menjadi root dan mengedit / etc / passwd, mis. sudo vi /etc/passwdCari baris yang dimulai dengan nama pengguna Anda. Mungkin diakhiri dengan :/bin/bash. Ubah / bin / bash ke / usr / bin / tmux dan sekarang tmux adalah shell login default Anda.

Namun, tidak ada jaminan bahwa ini tidak akan menyebabkan masalah!

Yang mungkin bekerja lebih baik adalah TIDAK melakukan apa pun yang membutuhkan hak akses root. Saya akan mencoba membuat file di directoy rumah saya bernama .bash_login dan mulai tmux dari dalam file itu: `echo" tmux "> ~ / .bash_login.

Ini seharusnya bekerja, tetapi Anda harus mencoba dan menemukan sendiri, b / c dokumentasi bash tidak terlalu tepat tentang file apa yang dibaca dan dieksekusi ketika.

Bananguin
sumber
2
Apa yang dijelaskan paragraf pertama Anda adalah apa chshfungsinya! Kecuali bahwa cara Anda membutuhkan root dan rawan kesalahan. Menjalankan tmuxdari .bash_loginadalah lebih mungkin untuk istirahat remote login.
Gilles