Làm thế nào để biết nếu phiên cuối đang chạy trong màn hình


9

Khi chạy tập lệnh bash, tôi muốn có thể biết nếu nó đang chạy trong một screen. Điều này có thể không?

Tôi muốn điều này để .bashrccó thể đặt màu của dấu nhắc lệnh tùy thuộc vào việc các phiên có được bắt đầu trong một màn hình hay không.

Phát hiện ra liên kết này khi tôi được trả lời: Làm thế nào tôi có thể biết liệu tôi đang ở trong màn hình?

Câu trả lời:


10

Thông thường, $STYsẽ được thiết lập.

Vì thế:

if [ -n "$STY" ]; then
  echo "I'm most likely running under screen"
fi

$STYthường là những gì bạn cần nói chuyện với của bạn screen. Điều đó được sử dụng để xây dựng đường dẫn của ổ cắm tên miền Unix được sử dụng để kiểm soát screen(đại loại như thế /var/run/screen/S-$USER/$STY.

Bây giờ, điều đó sẽ không hoạt động nếu từ màn hình đó, bạn sshsang một máy khác. Shell bắt đầu sẽ không có $STYtrong môi trường của nó và dù sao nó cũng sẽ không được sử dụng cho nó, vì nó sẽ không thể truy cập vào các ổ cắm tên miền Unix trên máy của bạn.

Tuy nhiên, có thể truy vấn thiết bị đầu cuối với một chuỗi thoát để xác định loại của nó:

if [ -t 1 ] && [ -t 0 ]; then
  s=$(stty -g)
  stty -icanon -echo min 0 time 3
  printf '\033[>c'
  type=$(dd count=1 2> /dev/null)
  stty "$s"
  case $type in
    (*'>83;'*) echo "this is screen"
  esac
fi

Một cách tiếp cận khác, như được đề xuất bởi @ val0x00ff là kiểm tra giá trị của $TERMbiến môi trường. Giá trị đó có nghĩa là cho các ứng dụng biết loại thiết bị đầu cuối mà họ đang nói đến. Nó được thiết lập bởi screenmột cái gì đó bắt đầu bằng screen(như screencó thể thực hiện các biến thể khác nhau của thiết bị đầu cuối). $TERMđược truyền accross rlogin, rsh, telnet, ssh. Nó không được đảm bảo để làm việc như trên nhưng đơn giản và ít xâm nhập hơn.

case $TERM in
  (screen*) echo "I'm more than likely running in screen"
esac

Giống như đối với giải pháp trước đó, bạn có thể đang chạy screen, nhưng bạn không thể đưa ra lệnh cho nó screen -X. Tuy nhiên, lưu ý rằng bạn có thể truyền lệnh bằng các chuỗi thoát (mặc dù nó không được bật theo mặc định vì lý do bảo mật).


4

Khi chạy trong màn hình, $TERMbiến môi trường của bạn thay đổi thành màn hình. Bạn có thể kiểm tra trong tập lệnh, vd

if [[ "$TERM" == screen* ]]; then
  echo "Running in screen"
else 
  echo "Outside screen"
fi 

Đó sẽ là một trong những cách tiếp cận. echo $TERMbên ngoài màn hình và một lần nữa echo $TERMbên trong màn hình và thấy sự khác biệt


$ TATE của tôi được đặt thành "xterm". Vì vậy, điều này sẽ không hoạt động trong trường hợp của tôi.
aakoch

1

Tôi sử dụng tmux cho mình và chỉ một chút này để liệt kê các phiên nếu tôi chưa tham gia phiên tmux

if [ -z "$TMUX" ]; then
    alias tmuxa='tmux attach -d -t'
    alias tmuxc='tmux new-session -s'
    echo "You're not in a tmux session, create a new one with tmuxc, or attach to one of the ones below with tmuxa"
    tmux ls
fi
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.