Bagaimana cara saya meminta layar untuk berperilaku seperti bash shell standar?


37

Baru belajar tentang perintah layar di linux - itu jenius. Aku menyukainya. Namun, terminal / prompt aktual di layar terlihat dan berperilaku berbeda dari standar bash prompt saya. Artinya, warnanya tidak sama, pelengkapan tab sepertinya tidak berfungsi, dll.

Apakah ada cara saya dapat memberitahu layar untuk berperilaku seperti bash prompt yang normal (setidaknya, normal seperti yang saya terbiasa)?

informasi tambahan

Saya terhubung melalui ssh dari Mac (Terminal) ke kotak linux tanpa kepala (Ubuntu). Setelah masuk, saya miliki TERM=xterm-colordan ketika saya menjalankan layar saya miliki TERM=screen.

Saya akan mencoba saran di bawah ini untuk melihat apakah saya dapat mengubah $TERMnilainya terlebih dahulu.


Hanya ingin tahu OS apa, dan apa jenis terminal yang Anda miliki saat memulai layar? Saya kira masalah Anda lebih berkaitan dengan Terminal Anda melakukan sesuatu yang salah atau mengidentifikasi secara tidak benar ke layar.
Zoredache

@Zoredache - Saya menambahkan informasi itu ke pos di atas. Terima kasih. Saya memang harus menyesuaikan pengaturan Terminal saya untuk memungkinkan tombol backspace bekerja ...
thornomad

Ya, saya benar-benar tidak suka Terminal.app. Secara pribadi saya sarankan Anda mempertimbangkan untuk menggunakan lihat alternatif ( serverfault.com/questions/19240/... )
Zoredache

Jawaban:


39

Berkat posting ini , yang saya lakukan adalah menambahkan satu baris ke ~/.screenrc:

# ~/.screenrc
defshell -bash      # dash makes it a login shell

Kemudian hal-hal di Anda ~/.bashrc, /etc/bashrc, dll harus terlindas.


13

layar mengubah jenis istilah menjadi screen. Anda dapat melakukan satu dari dua hal:

  1. ubah pengaturan istilah di .screenrc
  2. memodifikasi .bashrcmencari file Anda TERM=screenjugaTERM=xterm

4
Terima kasih! Saya membuat $HOME/.screenrcfile dan menambahkan baris ini ke atas: term xterm-colordan wa la! Prompt warna dan $TERMnilainya cocok. Namun, tidak ada penyelesaian tab ...
thornomad

Anda perlu menggali apa yang mengaktifkan penyelesaian tab. Skrip konfigurasi shell default tidak sepenuhnya konsisten tentang apa yang mereka aktifkan berdasarkan $TERM; beberapa hal akan diaktifkan dengan xterm serta xterm-color, yang lain hanya mencari xterm. Hal-hal lain memiliki switch lain.
Statika

11

Saya suka cara Anda menulis pertanyaan Anda, saya bertanya pada diri sendiri hal yang sama dan butuh beberapa saat untuk mengetahuinya. Saya beruntung sudah tahu sedikit tentang doa shell, jadi saya pikir masalahnya ada di suatu tempat.

Inilah temuan saya. Pertama, saya pribadi menganggapnya menarik dan layak untuk mengetahui perbedaan antara shell login dan shell non-login. Lakukan man $SHELLdan cari bagian tentang INVOKASI untuk membaca lebih lanjut tentang hal itu.

Anda dapat menanyakan instance shell Anda saat ini apakah itu shell login atau shell non-login dengan mengeluarkan shopt login_shellprompt Anda. Perhatikan ini biasanya opsi hanya baca.

Di sistem Debian saya, screenselalu default dengan shell non-login.

Setelah mencari di web dan membaca man $SHELL, saya menguji beberapa hal dan dua pendekatan berikut berhasil bagi saya. Di ~/.screenrcadd / memperbarui baris sebagai berikut:

shell -$SHELL

Jika itu tidak berhasil DAN Anda menggunakan bash, Anda bisa mencoba, seperti dibagikan oleh Seamus :

defshell -bash

Seperti disebutkan, Anda dapat menguji apakah instance shell Anda saat ini adalah shell login dengan mengeluarkan shopt login_shellprompt Anda.


Apakah cara untuk meluncurkan shell di direktori saat ini? Contoh dari apa yang saya inginkan adalah sebagai berikut cd ~/Projects ; screen ; pwd #=> ~/Projects. Namun, apa yang saya dapatkan setelah menambahkan shell -$SHELLke saya ~/.screenrcadalahcd ~/Projects ; screen ; pwd #=> ~/
rudolph9

9

Bergantung pada bagaimana Anda terbiasa menjalankan Bash, Anda mungkin menjalankan shell login. Ketika Anda menjalankan screen, Anda menjalankan shell interaktif non-login.

Perbedaannya adalah di mana skrip startup dijalankan.

  • /etc/bash.bashrckemudian ~/.bashrcbersumber ketika shell interaktif non-login dimulai

  • /etc/profilemaka pertama kali ditemukan dari ~/.bash_profile, ~/.bash_login, dan ~/.profileyang bersumber ketika interaktif shell login dimulai

Ini mungkin memengaruhi Anda.

Saya juga akan memeriksa untuk melihat apakah $TERMberbeda.


2

layar tidak menggantikan bash, menjalankannya, atau shell lainnya. mungkin itu berjalan csh, zshatau bashtapi dengan paramters yang berbeda.

hal pertama yang akan saya coba adalah mengecek psdan /proc/<pid>/cmdlinememastikan bahwa ia menggunakan shell yang sama dengan parameter yang sama seperti loginhalnya.

setelah itu, periksa /etc/screenrcdan file lain yang disebutkan di man screenbagian FILES.


Saya menjalankan sebuah psperintah dan itu menunjukkan bahwa bashsedang berjalan (ini adalah perintah ps di dalam layar) ... Saya mendapatkan warna yang berfungsi (di atas) hanya perlu penyelesaian tab.
thornomad

2

Saya memiliki masalah yang sama, ketika saya menjalankan layar saya kehilangan prompt warna PS1 keren yang saya temukan: P.

Masalahnya adalah saya menjalankannya seperti ini di ~ / .bash_profile

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Itu berarti bahwa ketika layar menjalankan bash_profile PS1 tidak dibawa.

Cara mengatasinya mudah: tambahkan ekspor ke pernyataan PS1 di ~. / Bash_profile agar terlihat seperti ini:

export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Seperti itu variabel tidak hilang dalam eksekusi bersarang.


1

Hanya ingin menambahkan sesuatu tentang "defshell-bash" (yang baru saja saya ketahui, setelah berbulan-bulan menggaruk-garuk kepala). Ketika Anda melakukan itu, shell anak yang dijalankan oleh layar memiliki $ SHELL yang disetel ke "bash", bukan "/ bin / bash" seperti biasanya. Jika Anda kemudian menjalankan "skrip" di dalam sesi layar Anda, Anda mendapatkan:

$ script
Script started, file is typescript
script: failed to execute bash: No such file or directory

Atau setidaknya itulah yang terjadi pada kotak Ubuntu 14.04 saya. Solusi yang saya gunakan adalah menjalankan $ SHELL=/bin/bash script. Saya akan membayangkan kesalahan set $ SHELL akan merusak hal-hal lain, tetapi script adalah apa yang saya perhatikan.


0

Saya menggunakan cuplikan ini di saya .profilesebelum inisialisasi shell dimulai: which screen > /dev/null 2>&1 && { screen -q -ls if [ $? -gt 10 ]; then read -p "$(tput setaf 2)Found a running SCREEN sesion, attach?$(tput sgr0)[Y/n] " y >&2 if [ "${y:-y}" = "y" -o "$y" = "Y" ]; then screen -aDR && logout fi else echo "$(tput setaf 3)No running SCREEN sessions found.$(tput sgr0)" >&2 fi }

Kemudian, jika tidak ada sesi layar berjalan, saya ... well, saya tidak jatuh ke prompt shell standar. Ada satu lagi prompt untuk sudopasword (karena 99% dari waktu saya masuk untuk mengelola server), dan jika saya berencana untuk melakukan tugas yang panjang, saya membatalkan masuk sudo, luncurkan layar secara manual di sesi pengguna saya dan sudo di sana.

Titik kunci di sini adalah "sebelum inisialisasi shell", sehingga ketika Anda sudah memiliki sesi layar berjalan, sudah diinisialisasi dengan lokal dan hal-hal lain dan Anda tidak perlu mengulanginya lagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.