Làm cách nào để yêu cầu màn hình hoạt động giống như vỏ bash tiêu chuẩn?


37

Chỉ cần học về lệnh màn hình trên linux - đó là thiên tài. Tôi thích nó. Tuy nhiên, thiết bị đầu cuối / dấu nhắc thực tế trong màn hình trông và hoạt động khác với dấu nhắc bash tiêu chuẩn của tôi. Đó là, màu sắc không giống nhau, hoàn thành tab dường như không hoạt động, v.v.

Có cách nào để tôi có thể bảo màn hình hoạt động giống như một dấu nhắc bash bình thường (ít nhất là bình thường như trong những gì tôi đã quen) không?

thông tin thêm

Tôi đang kết nối qua ssh từ máy Mac (Terminal) đến hộp linux không đầu (Ubuntu). Sau khi đăng nhập, tôi có TERM=xterm-colorvà khi tôi chạy màn hình tôi có TERM=screen.

Tôi sẽ thử các đề xuất dưới đây để xem liệu tôi có thể thay đổi $TERMgiá trị trước không.


Chỉ tò mò hệ điều hành nào, và bạn có loại thiết bị đầu cuối nào khi bắt đầu màn hình? Tôi đoán các vấn đề của bạn có liên quan nhiều hơn với Terminal của bạn đang làm gì đó sai hoặc xác định không chính xác để sàng lọc.
Zoredache

@Zoredache - Tôi đã thêm thông tin đó vào bài viết ở trên. Cảm ơn. Tôi đã phải điều chỉnh cài đặt của Terminal để cho phép phím backspace hoạt động ...
thornomad

Ái chà, tôi thực sự không thích Terminal.app. Cá nhân tôi khuyên bạn nên cân nhắc sử dụng một chế độ xem thay thế ( serverfault.com/questions/19240/ trên )
Zoredache

Câu trả lời:


38

Nhờ bài đăng này , những gì tôi đã làm là thêm một dòng vào ~/.screenrc:

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

Sau đó, mọi thứ trong bạn ~/.bashrc, /etc/bashrcvv nên được chạy.


13

màn hình thay đổi loại thuật ngữ thành screen. Bạn có thể làm một trong hai việc:

  1. thay đổi cài đặt thuật ngữ trong của bạn .screenrc
  2. sửa đổi các .bashrctập tin của bạn tìm kiếm TERM=screencũng nhưTERM=xterm

4
Cảm ơn! Tôi đã tạo một $HOME/.screenrctệp và thêm dòng này vào đầu: term xterm-colorvà wa la! Dấu nhắc màu và các $TERMgiá trị khớp. Tuy nhiên, không hoàn thành tab ...
thornomad

Bạn cần đào sâu vào những gì bật tính năng hoàn thành tab. Các tập lệnh cấu hình shell mặc định không hoàn toàn nhất quán về những gì chúng kích hoạt dựa trên $TERM; một số thứ sẽ kích hoạt với xterm cũng như xterm-color, những thứ khác chỉ tìm xterm. Những thứ khác có công tắc khác.
staticsan

11

Tôi thích cách bạn viết câu hỏi của bạn, tôi đã tự hỏi mình điều tương tự và phải mất một chút thời gian để tìm ra nó. Tôi đã may mắn khi biết một chút về việc gọi shell, vì vậy tôi đã tìm ra vấn đề nằm ở đâu đó.

Dưới đây là những phát hiện của tôi. Đầu tiên, cá nhân tôi thấy thú vị và đáng để biết sự khác biệt giữa vỏ đăng nhập và vỏ không đăng nhập. Thực hiện man $SHELLvà tìm kiếm phần trên HÓA ĐƠN để đọc thêm về nó.

Bạn có thể hỏi ví dụ shell hiện tại của mình nếu shell đăng nhập hoặc shell không đăng nhập bằng cách đưa ra shopt login_shelldấu nhắc của bạn. Lưu ý đây thường là một tùy chọn chỉ đọc.

Trên các hệ thống Debian của tôi, screenluôn được mặc định với các shell không đăng nhập.

Sau khi tìm kiếm trên web và đọc man $SHELL, tôi đã thử nghiệm một vài điều và hai cách tiếp cận sau đây có hiệu quả với tôi. Trong ~/.screenrcthêm / cập nhật một dòng như sau:

shell -$SHELL

Nếu điều đó không hiệu quả VÀ bạn đang sử dụng bash, bạn có thể thử thay thế, như được chia sẻ bởi Seamus :

defshell -bash

Như đã đề cập, bạn có thể kiểm tra xem phiên bản shell hiện tại của bạn có phải là shell đăng nhập hay không bằng cách đưa ra shopt login_shelllời nhắc của bạn.


Là cách để có shell khởi chạy trong thư mục hiện tại? Một ví dụ về những gì tôi mong muốn là sau đây cd ~/Projects ; screen ; pwd #=> ~/Projects. Tuy nhiên, những gì tôi nhận được sau khi thêm shell -$SHELLvào ~/.screenrccd ~/Projects ; screen ; pwd #=> ~/
rudolph9

9

Tùy thuộc vào cách bạn đã sử dụng để chạy Bash, bạn có thể đang chạy shell đăng nhập. Khi bạn chạy screen, bạn đang chạy một vỏ tương tác không đăng nhập.

Sự khác biệt là trong đó các kịch bản khởi động được chạy.

  • /etc/bash.bashrcsau đó ~/.bashrccó nguồn gốc khi một vỏ tương tác không đăng nhập được bắt đầu

  • /etc/profilesau đó tìm thấy đầu tiên của ~/.bash_profile, ~/.bash_login~/.profilecó nguồn gốc khi một vỏ đăng nhập tương tác được bắt đầu

Điều này có thể ảnh hưởng đến bạn.

Tôi cũng sẽ kiểm tra xem $TERMcó khác không.


2

màn hình không thay thế bash, nó chạy nó hoặc bất kỳ shell nào khác. có thể nó đang chạy csh, zshhoặc bashnhưng với paramters khác nhau.

điều đầu tiên tôi sẽ thử là kiểm tra ps/proc/<pid>/cmdlinechắc chắn rằng nó sử dụng cùng một vỏ với các tham số giống như loginvậy.

sau đó, kiểm tra /etc/screenrcvà bất kỳ tập tin nào khác được đề cập trong man screenphần PHIM.


Tôi đã chạy một pslệnh và nó cho thấy nó bashđang chạy (đây là lệnh ps bên trong màn hình) ... Tôi đã làm việc màu (ở trên) chỉ cần hoàn thành tab.
thornomad

2

Tôi gặp vấn đề tương tự, khi tôi chạy màn hình, tôi đã mất dấu nhắc màu PS1 thú vị mà tôi đã tìm thấy một cách khéo léo: P.

Vấn đề là tôi đã chạy nó như thế này trong ~ / .bash_profile

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

Điều đó có nghĩa là khi màn hình đang chạy bash_profile, PS1 sẽ không được chuyển sang.

Khắc phục rất dễ dàng: thêm xuất vào câu lệnh PS1 trong ~. / Bash_profile để trông như thế này:

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

Như thế, biến không bị mất trong thực thi lồng nhau.


1

Chỉ muốn thêm một cái gì đó về "defshell -bash" (mà tôi vừa tìm ra, sau nhiều tháng gãi đầu). Khi bạn làm điều đó, shell con chạy bằng màn hình có $ SHELL được đặt thành "bash", thay vì "/ bin / bash" như bình thường. Nếu sau đó bạn chạy "tập lệnh" trong phiên màn hình của mình, bạn sẽ nhận được:

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

Hoặc ít nhất đó là những gì xảy ra trên hộp Ubuntu 14.04 của tôi. Cách giải quyết mà tôi đang sử dụng là chạy $ SHELL=/bin/bash script. Tôi sẽ tưởng tượng rằng $ SHELL được đặt sai sẽ phá vỡ những thứ khác, nhưng kịch bản là những gì tôi đã nhận thấy.


0

Tôi đang sử dụng đoạn mã này .profiletrước khi bất kỳ khởi tạo shell nào được bắt đầu: 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 }

Sau đó, nếu không có phiên màn hình nào đang chạy, thì tôi cũng vậy, tôi không rơi vào dấu nhắc shell tiêu chuẩn. Có thêm một lời nhắc cho mật khẩu sudo(vì 99% thời gian tôi đăng nhập để quản trị máy chủ) và nếu tôi dự định thực hiện một tác vụ dài, tôi hủy đăng nhập sudo, khởi chạy màn hình theo cách thủ công trong phiên của người dùng và sudo ở đó.

Điểm mấu chốt ở đây là "trước bất kỳ khởi tạo shell nào", do đó, khi bạn đã có phiên màn hình đang chạy, nó đã được khởi tạo với ngôn ngữ và các thứ khác và bạn không cần phải làm lại lần nữa.

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.