Bagaimana cara mengetahui apakah sesi terminal berjalan di dalam layar

9

Saat menjalankan skrip bash, saya ingin mengetahui apakah skrip tersebut berjalan di dalam a screen. Apakah ini mungkin?

Saya ingin ini sehingga .bashrcdapat mengatur warna command prompt tergantung pada apakah sesi dimulai dalam layar atau tidak.

Menemukan tautan ini setelah tautan saya dijawab: Bagaimana saya bisa tahu apakah saya ada di layar?

DustByte
sumber

Jawaban:

10

Biasanya, $STYakan diatur.

Begitu:

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

$STYbiasanya apa yang perlu Anda bicarakan dengan Anda screen. Itu digunakan untuk membangun jalur soket domain Unix yang digunakan untuk mengontrol screen(sesuatu seperti /var/run/screen/S-$USER/$STY.

Sekarang, itu tidak akan berfungsi misalnya jika dari layar itu, Anda sshke komputer lain. Shell mulai tidak ada $STYdi lingkungannya, dan itu tidak akan ada gunanya untuk itu, karena itu tidak akan dapat mengakses soket domain Unix pada mesin Anda.

Namun, dimungkinkan untuk menanyakan terminal dengan urutan keluar untuk menentukan jenisnya:

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

Pendekatan lain, seperti yang disarankan oleh @ val0x00ff adalah untuk memeriksa nilai $TERMvariabel lingkungan. Nilai itu dimaksudkan untuk memberi tahu aplikasi jenis terminal yang mereka ajak bicara. Ini diatur oleh screensesuatu yang dimulai dengan screen(seperti screendapat mengimplementasikan varian terminal yang berbeda). $TERMdilewatkan accross rlogin, rsh, telnet, ssh. Ini tidak dijamin untuk bekerja seperti di atas tetapi lebih sederhana dan kurang mengganggu.

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

Seperti untuk solusi sebelumnya, Anda mungkin menjalankan screen, tetapi Anda mungkin tidak dapat mengeluarkan perintah dengan screen -Xmisalnya. Namun perhatikan, bahwa Anda dapat meneruskan perintah menggunakan urutan melarikan diri (meskipun tidak diaktifkan secara default karena alasan keamanan).

Stéphane Chazelas
sumber
4

Saat berjalan di layar, $TERMvariabel lingkungan Anda berubah ke layar. Anda dapat memeriksa di skrip misalnya

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

Itu akan menjadi salah satu pendekatan. echo $TERMdi luar layar dan lagi echo $TERMdi dalam layar dan lihat perbedaannya

Valentin Bajrami
sumber
$ TERM saya disetel ke "xterm". Jadi, ini tidak akan berhasil dalam kasus saya.
aakoch
1

Saya menggunakan tmux sendiri, dan ini sedikit untuk daftar sesi hanya jika saya belum dalam sesi 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
Rqomey
sumber