Làm thế nào tôi có thể biết nếu tôi đang ở trong phiên tmux từ tập lệnh bash?


53

Tôi thích giữ bash_profiletrong kho git của mình và sao chép nó vào bất kỳ máy nào tôi có quyền truy cập shell. Vì tmuxhầu hết thời gian tôi có một user@hostchuỗi trong dòng trạng thái, thay vì điểm truyền thống của nó trong dấu nhắc shell.

Tuy nhiên, không phải tất cả các trang web tôi sử dụng đã tmuxcài đặt hoặc không phải lúc nào tôi cũng có thể sử dụng nó. Tôi muốn phát hiện khi tôi không tham gia tmuxphiên và điều chỉnh lời nhắc của mình cho phù hợp. Cho đến nay, giải pháp nửa nướng của tôi .bash_profiletrông giống như thế này:

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(Kiểm tra mọi lúc có lẽ không phải là cách tiếp cận tốt nhất, vì vậy tôi mở các đề xuất để có cách làm tốt hơn. Kịch bản Bash không phải là sở trường của tôi.)

Câu trả lời:


72

Tmux đặt TMUXbiến môi trường trong các phiên tmux và đặt TERMthành screen. Đây không phải là chỉ số đáng tin cậy 100% (ví dụ: bạn không thể dễ dàng biết mình đang chạy screenbên trong tmuxhay tmuxbên trong screen), nhưng nó sẽ đủ tốt trong thực tế.

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

Nếu bạn cần tích hợp nó trong một dấu nhắc phức tạp được đặt qua PROMPT_COMMAND(đó là cài đặt bash, thì nhân tiện, không nên xuất):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

Nếu bạn cần kiểm tra xem tmux đã được cài đặt chưa:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

Nhân tiện, tất cả điều này sẽ đi vào ~/.bashrcchứ không phải ~/.bash_profile(xem Sự khác biệt giữa .bashrc và .bash_profile ). ~/.bashrcđược chạy trong mọi trường hợp bash và chứa các tùy chỉnh shell như lời nhắc và bí danh. ~/.bash_profileđược chạy khi bạn đăng nhập (nếu vỏ đăng nhập của bạn bị bash). Điều kỳ lạ là bash không đọc ~/.bashrctrong shell đăng nhập, vì vậy bạn ~/.bash_profilenên chứa

case $- in *i*) . ~/.bashrc;; esac

Có một biến thay thế TMUX_PANElà tốt. Tôi chỉ nhận thấy vì công thức của bạn không hoạt động. Sau đó tôi phát hiện ra rằng tôi đã sử dụng quá mức (và sau đó unset) một biến trong tập lệnh shell mà tôi đang tìm nguồn cung ứng thông qua .profile.
0xC0000022L

[ "$TERM" = "screen" ]có thể không hoạt động Trong trường hợp của tôi, màn hình của tôi đã báo cáo là screen-256màu.
StevieD

@StevieD Tôi không nghĩ tmux tự làm việc này, nhưng nó có thể là một bản vá phân phối hoặc cấu hình.
Gilles 'SO- ngừng trở nên xấu xa'

2

Sau khi thử nhiều cách khác nhau, đây là điều cuối cùng có hiệu quả với tôi, trong trường hợp nó giúp được bất cứ ai ngoài đó:

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

Trong đoạn mã này, tôi kiểm tra xem nếu chúng ta không ở trong môi trường TMUX, tôi sẽ khởi chạy nó. Nếu bạn đặt đoạn mã này vào .bashrctệp của mình , bạn sẽ tự động chạy TMUX bất cứ khi nào bạn mở thiết bị đầu cuối! PS: đã thử nghiệm trên Ubuntu shell.


1

Đối với các câu trả lời trước, việc kiểm tra ${TERM}biến có thể dẫn đến các trường hợp góc, tmuxđặt các biến môi trường trong vòng đời của chính nó:

$ env | grep -i tmux
TMUX = / tmp / tmux-1000 / mặc định, 4199,5
TMUX_Pane =% 9
TMUX_PLUGIN_MANAGER_PATH = / home / imil / .tmux / plugin /

Để kiểm tra xem bạn có ở trong tmuxmôi trường không, chỉ cần kiểm tra:

$ [ -z "${TMUX}" ] && echo "not in tmux"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.