Tôi muốn shell bash mặc định của tôi đi thẳng vào tmux thay vì tôi luôn phải gõ tmux mỗi lần.
Tôi muốn shell bash mặc định của tôi đi thẳng vào tmux thay vì tôi luôn phải gõ tmux mỗi lần.
Câu trả lời:
Điều này dường như hoạt động ...
https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login
Chỉ cần thêm dòng mã bash sau vào .bashrc của bạn trước các bí danh của bạn; mã cho các shell khác rất giống nhau:
[[ $TERM != "screen" ]] && exec tmux
TERMcó thể được đặt thành một số giá trị khác bởi .tmux.conftệp của người dùng . Tốt hơn để kiểm tra xem TMUXbiến được đặt hay không.
Câu trả lời của @ Starer nói chung là chính xác, mặc dù tôi thường bao gồm các thử nghiệm sau để đảm bảo rằng (1) tmux tồn tại trên hệ thống, (2) chúng tôi đang ở trong một vỏ tương tác và (3) tmux không thử chạy trong Chính nó:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
Người giới thiệu
commandđể kiểm tra sự tồn tại của lệnh - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommandthay vì whichkiểm tra sự tồn tại của các lệnh - https://unix.stackexchange.com/a/85250$PS1để kiểm tra vỏ tương tác - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERMbiến môi trường dự kiến "cho tất cả các chương trình chạy bên trong tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommandtrước đây nhưng không nhận ra nó tồn tại.
exectuyên bố không cho phép bạn thoát khỏi tmux mà không thoái toàn bộ thiết bị đầu cuối! : |
execthay thế quy trình hiện tại bằng quy trình mới - trong trường hợp này, nó thay thế vỏ đăng nhập bash bằng tmux, vì vậy khi tmux thoát thì không có thiết bị đầu cuối nào khác quay trở lại :)
exec tmuxbằng hương vị ưa thích của bạntmux attach
exec tmuxtôi sử dụng exec tmux new-session -A -s mainvì vậy tôi sẽ luôn có một phiên gọi là chính và đính kèm với nó (thay vì tạo một phiên mới mỗi khi tôi kết nối với máy từ xa của mình) nhưng nó sẽ không gặp sự cố như sử dụng tmux attachtrong trường hợp không có phiên nào (tìm thấy ở đây: unix.stackexchange.com/a/176885/256942 )
Thêm một dòng như
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
trong tệp bashrc của bạn có thể sẽ thực hiện công việc. Lưu ý dòng này sẽ thoát ssh và chấm dứt kết nối khi bạn tách hoặc thoát tmux. Tôi thích cấu hình này vì nó lưu các nét chính để chấm dứt kết nối. Nhưng nếu bạn không thích điều này (điều mà tôi nghĩ là rất khó xảy ra) và thà ở lại trong vỏ đăng nhập sau khi chấm dứt, chỉ cần xóa exitphần:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Cũng lưu ý bạn không nên quấn tmux attachvới exec, vì điều này sẽ gây ra sự kết nối được đóng cửa khi không có phiên tmux để đính kèm vào.
Có lệnh chshthay đổi vỏ đăng nhập. Tham khảo ý kiến man chsh.
tmuxkhông phải là một trình bao, nó là một bộ ghép kênh đầu cuối như màn hình GNU. Thật thú vị, nó không hỗ trợ -ctùy chọn theo trang man , vì vậy nó có thể hoạt động như một vỏ chỉ đủ để sử dụng nó làm vỏ đăng nhập của bạn, nhưng tôi nghi ngờ nó sẽ không hoạt động chính xác trong mọi tình huống, ví dụ như đăng nhập đồ họa qua gdm / kdm .
ssh $some_server echo foo).
/etc/shells, vì vậy đây là một vỏ đăng nhập hợp lệ.
default-shellcài đặt trong cấu hình tmux để trỏ đến trình bao thực tế.
Tôi đang sử dụng thành công
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
trong tôi .zshrc. Nếu bạn đang sử dụng bash, .bashrcthay vào đó hãy đặt nó vào .
Tôi cũng vừa thử cài đặt tmuxlàm shell mặc định ( chsh -s $(which tmux)) và nó dường như phá vỡ việc thực thi lệnh trực tiếp thông qua SSH, ví dụ như ssh $some_server echo foosẽ không tạo ra bất kỳ đầu ra nào.
Không có câu trả lời nào ở trên hoạt động với tôi - exec tmuxngăn tôi đóng tmux mà không thoát khỏi trình bao (cho dù nó được mở bằng Ctrl+ Thoặc từ menu ứng dụng).
Tôi sử dụng Linux Mint, cho phép bạn ánh xạ một số phím nóng nhất định tới các lệnh và (không phải như vậy đối với một số ..) Tôi đã có các bash shell với các lệnh bắt đầu từ đó, ví dụ Win+ Alt+ Bthực hiện một số bash -exec(vim)câu lệnh phức tạp chỉnh sửa .bashrc của tôi, để nó hoạt động như một trình bao thông thường.
tmux được tải chứ không phải vim trong tình huống đó sau khi đặt phần trên ở trên cùng của tôi .bashrc. Tôi đã gói dòng thực thi tmux trong một câu lệnh if khác, kiểm tra xem nó có chạy ở chế độ tương tác không.
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
Bạn có thể gói tất cả những thứ đó lên một dòng nhưng để dễ đọc tôi nghĩ điều đó tốt.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Thêm vào câu trả lời của @Louis Maddox, tôi sẽ thực hiện phần tmux với;
(exec tmux attach || exec tmux new-session)
exec sh -c 'tmux a || tmux', điều này (sau khi nhìn vào câu trả lời của bạn) có thể sẽ khiến điều tồi tệ xảy ra nếu tmux không thể bắt đầu vì bất kỳ lý do nào ..... cảm ơn, tôi sẽ sử dụng của bạn từ bây giờ :)
tmux new -A -s mysessioncó lẽ cũng sẽ làm việc
Đây là trong ~/.profile(tôi đang sử dụng ksh93):
if [[ -z "$TMUX" ]]; then
if tmux has-session 2>/dev/null; then
exec tmux attach
else
exec tmux
fi
fi
Nếu TMUXbiến môi trường không được đặt / trống, thì chúng ta chưa tham gia phiên tmux, vì vậy ...
Nếu tmux has-sessiontrả về với trạng thái thoát không (đúng), có một phiên có sẵn để đính kèm. Đính kèm với nó.
Nếu không, tạo một phiên mới.
Cũng có thể sử dụng tmuxlàm vỏ đăng nhập của bạn. Tuy nhiên, nếu bạn làm điều này, hãy đảm bảo đặt default-shellthành một vỏ thực tế trong ~/.tmux.conftệp của bạn (xem hướng dẫn sử dụng tmux để biết thêm thông tin về điều này).
Bạn có thể (và như bây giờ có lẽ nên) sử dụng chshlệnh để đặt tmux làm shell mặc định, sau đó thêm phần sau vào .tmux.conf:
set-option -g default-shell /path/to/your/favourite/shell
Chỉ cần nhớ sửa đổi đường dẫn ở cuối dòng.
Tôi đã kết hợp các kiểm tra mở rộng, với kiểm tra phiên có điều kiện và đặt vòng quay của riêng tôi vào đó, để tạo một phiên mặc định được kết nối với hoặc được tạo khác. Trừ khi bạn ở trong một phiên tmux khác, hoặc các điều kiện bảo vệ khác được đáp ứng.
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
Dựa trên những câu trả lời sau:
Thêm cái này vào ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Như Mikel đã nêu trong bình luận của mình để có tmux vì vỏ đăng nhập của bạn có thể có tác dụng phụ. Nhưng bạn có thể làm cho tmuxvỏ mặc định của bạn, theo nghĩa đen. Trình bao mặc định của người dùng được xác định trong / etc / passwd. Vì vậy, bạn có thể trở thành root và chỉnh sửa / etc / passwd, ví dụ: sudo vi /etc/passwdtìm kiếm dòng bắt đầu bằng tên người dùng của bạn. Nó có thể kết thúc với :/bin/bash. Thay đổi / bin / bash thành / usr / bin / tmux và bây giờ tmux là vỏ đăng nhập mặc định của bạn.
Tuy nhiên, không có gì đảm bảo rằng điều này sẽ không gây ra vấn đề!
Những gì có thể làm việc tốt hơn là KHÔNG làm bất cứ điều gì đòi hỏi quyền lợi gốc. Tôi sẽ cố gắng tạo một tệp trong directoy nhà của tôi có tên .bash_login và bắt đầu tmux từ trong tệp đó: `echo" tmux "> ~ / .bash_login.
Điều này sẽ hoạt động, nhưng bạn phải thử và tự tìm kiếm, b / c tài liệu bash không chính xác về tập tin được đọc và thực thi khi nào.
chshlàm! Ngoại trừ cách của bạn yêu cầu phải root và dễ bị lỗi. Chạy tmuxtừ .bash_logincó nhiều khả năng phá vỡ đăng nhập từ xa.
[[ $- != *i* ]] && returnkhông phải là một vòng lặp vô hạn (từ cùng một trang)