ฉันจะขอให้หน้าจอทำงานเหมือนเปลือก bash มาตรฐานได้อย่างไร


37

เพิ่งเรียนรู้เกี่ยวกับคำสั่งหน้าจอบน linux - มันเป็นอัจฉริยะ ฉันรักมัน. อย่างไรก็ตามหน้าจอเทอร์มินัล / พรอมต์ที่เกิดขึ้นจริงจะมีลักษณะและการทำงานแตกต่างไปจากการแจ้งให้ใช้ bash มาตรฐาน นั่นคือสีไม่เหมือนกันการเติมแท็บดูเหมือนจะไม่ทำงาน ฯลฯ

มีวิธีที่ฉันสามารถบอกให้หน้าจอทำงานเหมือนปกติ (อย่างน้อยปกติเหมือนในสิ่งที่ฉันคุ้นเคย) พร้อมท์ทุบตีหรือไม่?

ข้อมูลเพิ่มเติม

ฉันกำลังเชื่อมต่อผ่าน ssh จาก Mac (Terminal) ไปยังกล่อง linux ที่ไม่มีหัว (Ubuntu) หลังจากเข้าสู่ระบบผมมีและเมื่อผมทำงานหน้าจอผมมีTERM=xterm-colorTERM=screen

ฉันจะลองทำตามคำแนะนำด้านล่างเพื่อดูว่าฉันสามารถเปลี่ยน$TERMค่าได้ก่อน


เพียงแค่อยากรู้ว่า OS อะไรและคุณมีเทอร์มินัลชนิดใดเมื่อหน้าจอเริ่มต้น ฉันเดาว่าปัญหาของคุณเกี่ยวกับหน้าจอเทอร์มินัลทำอะไรไม่ถูกต้องหรือการระบุหน้าจอไม่ถูกต้อง
Zoredache

@Zoredache - ฉันเพิ่มข้อมูลนั้นในโพสต์ด้านบน ขอบคุณ ฉันต้องปรับการตั้งค่าเทอร์มินัลของฉันเพื่อให้ปุ่ม Backspace ทำงาน ...
thornomad

Yuck ฉันไม่ชอบ Terminal.app ส่วนตัวผมขอแนะนำให้คุณพิจารณาใช้ทางเลือกอื่น ( serverfault.com/questions/19240/… )
Zoredache

คำตอบ:


38

ขอบคุณโพสต์นี้สิ่งที่ฉันทำคือเพิ่มหนึ่งบรรทัดใน~/.screenrc:

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

สิ่งนั้นในของคุณ~/.bashrc, /etc/bashrcฯลฯ ควรจะได้รับการทำงาน


13

screenหน้าจอการเปลี่ยนแปลงระยะชนิด คุณสามารถทำหนึ่งในสองสิ่งต่อไปนี้:

  1. เปลี่ยนการตั้งค่าคำในของคุณ .screenrc
  2. แก้ไข.bashrcไฟล์ของคุณTERM=screenเช่นกันTERM=xterm

4
ขอบคุณ! ฉันสร้าง$HOME/.screenrcไฟล์และเพิ่มบรรทัดนี้ไปด้านบน: term xterm-colorและ wa la! การแจ้งสีและ$TERMค่าตรงกัน อย่างไรก็ตามไม่มีการเติมแท็บ ...
thornomad

คุณต้องขุดลงไปว่าอะไรที่ทำให้แท็บเสร็จสมบูรณ์ สคริปต์การกำหนดค่าเริ่มต้นเปลือกไม่ได้ทั้งหมดที่สอดคล้องกันเกี่ยวกับสิ่งที่พวกเขาช่วยให้อยู่บนพื้นฐานของ$TERM; บางสิ่งจะเปิดใช้งานด้วย xterm เช่นเดียวกับ xterm-color บางรายการจะมองหา xterm เท่านั้น สิ่งอื่น ๆ มีสวิตช์อื่น ๆ
staticsan

11

ฉันชอบวิธีที่คุณเขียนคำถามของคุณฉันถามตัวเองในสิ่งเดียวกันและใช้เวลาสักครู่เพื่อคิดออก ฉันโชคดีที่รู้เรื่องการเรียกใช้เชลล์เพียงเล็กน้อยดังนั้นฉันจึงพบว่าปัญหาเกิดขึ้นที่ใดที่หนึ่ง

นี่คือสิ่งที่ฉันค้นพบ ประการแรกฉันพบว่ามันน่าสนใจและคุ้มค่าที่จะทราบถึงความแตกต่างระหว่างล็อกอินเชลล์กับเชลล์ที่ไม่ใช่ล็อกอิน ทำman $SHELLและค้นหาหัวข้อใน INVOCATION เพื่ออ่านเพิ่มเติม

คุณสามารถถามอินสแตนซ์เชลล์ปัจจุบันของคุณว่าเป็นเชลล์ล็อกอินหรือเชลล์ที่ไม่ได้ล็อกอินโดยออกเป็นshopt login_shellพรอมต์ของคุณ หมายเหตุนี่เป็นตัวเลือกอ่านอย่างเดียว

ในระบบ Debian ของฉันscreenมีการผิดนัดมาจากเปลือกหอยที่ไม่ใช่การเข้าสู่ระบบเสมอ

หลังจากค้นหาเว็บและการอ่านman $SHELLฉันทดสอบสองสามอย่างและวิธีการสองอย่างต่อไปนี้ได้ผลสำหรับฉัน ในการ~/.screenrcเพิ่ม / อัปเดตบรรทัดดังต่อไปนี้:

shell -$SHELL

หากนั่นไม่ได้ผลและคุณกำลังใช้อยู่bashคุณสามารถลองใช้ร่วมกันโดยSeamus :

defshell -bash

ดังที่ได้กล่าวมาคุณสามารถทดสอบว่าอินสแตนซ์เชลล์ปัจจุบันของคุณเป็นเชลล์ล็อกอินหรือไม่โดยการออกshopt login_shellให้คุณ


เป็นวิธีการเปิดตัวเชลล์ในไดเรกทอรีปัจจุบันหรือไม่? cd ~/Projects ; screen ; pwd #=> ~/Projectsตัวอย่างของสิ่งที่ฉันต้องการคือต่อไปนี้ อย่างไรก็ตามสิ่งที่ฉันได้รับหลังจากเพิ่มshell -$SHELLลงในของฉัน~/.screenrcคือcd ~/Projects ; screen ; pwd #=> ~/
rudolph9

9

ขึ้นอยู่กับว่าคุณคุ้นเคยกับการใช้ Bash อย่างไรคุณอาจใช้เชลล์ล็อกอิน เมื่อคุณเรียกใช้screenคุณกำลังเรียกใช้เชลล์แบบโต้ตอบที่ไม่ได้ลงชื่อเข้าใช้

ข้อแตกต่างคือสคริปต์เริ่มต้นทำงาน

  • /etc/bash.bashrcจากนั้น~/.bashrcจะมีที่มาเมื่อเริ่มต้นเชลล์แบบโต้ตอบที่ไม่ใช่การเข้าสู่ระบบ

  • /etc/profileจากนั้นพบครั้งแรกของ~/.bash_profile, ~/.bash_loginและ~/.profileมีที่มาเมื่อเริ่มเข้าสู่ระบบเปลือกโต้ตอบ

สิ่งนี้อาจส่งผลกระทบต่อคุณ

ฉันก็จะตรวจสอบเพื่อดูว่า$TERMแตกต่างกัน


2

หน้าจอไม่ได้แทนที่ทุบตีมันทำงานหรือเปลือกอื่น ๆ บางทีมันอาจจะทำงานcsh, zshหรือbashแต่มีพารามิเตอร์ที่แตกต่างกัน

สิ่งแรกที่ผมจะพยายามคือการตรวจสอบกับpsและ/proc/<pid>/cmdlineเพื่อให้แน่ใจว่าจะใช้เปลือกเดียวกันกับพารามิเตอร์เช่นเดียวกับloginไม่

หลังจากนั้นให้ตรวจสอบ/etc/screenrcและไฟล์อื่น ๆ ที่กล่าวถึงในman screenส่วนไฟล์


ฉันรันpsคำสั่งและมันแสดงว่าbashกำลังทำงานอยู่ (นี่คือคำสั่ง ps ที่อยู่ในหน้าจอ) ... ฉันได้รับการทำงานของสี (ด้านบน) เพียงแค่ต้องกรอกข้อมูลในแท็บ
thornomad

2

ฉันมีปัญหาเดียวกันเมื่อฉันวิ่งไปที่หน้าจอฉันทำพรอมต์สี PS1 เจ๋ง ๆ ที่ฉันพบโดยบังเอิญ: P

ปัญหาคือฉันกำลังใช้งานมันใน ~ / .bash_profile

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

นั่นหมายความว่าเมื่อหน้าจอรัน bash_profile PS1 จะไม่ถูกนำไปใช้

การแก้ไขนั้นง่าย: เพิ่มการส่งออกไปยังคำสั่ง PS1 ใน ~. / bash_profile เพื่อให้มีลักษณะดังนี้:

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

เช่นเดียวกับที่ตัวแปรไม่สูญหายในการประมวลผลซ้อน


1

เพียงแค่ต้องการเพิ่มบางสิ่งเกี่ยวกับ "defshell -bash" (ซึ่งฉันเพิ่งค้นพบหลังจากเดือนของการเกาหัว) เมื่อคุณทำเช่นนั้นเชลล์ลูกที่รันโดยหน้าจอจะตั้งค่า $ SHELL เป็น "bash" แทนที่จะเป็น "/ bin / bash" เหมือนปกติ หากคุณเรียกใช้ "สคริปต์" ในเซสชันหน้าจอคุณจะได้รับ:

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

หรืออย่างน้อยนั่นคือสิ่งที่เกิดขึ้นกับกล่อง Ubuntu 14.04 ของฉัน $ SHELL=/bin/bash scriptวิธีแก้ปัญหาที่ผมเคยใช้คือการทำงาน ฉันคิดว่าการมีชุด $ SHELL ผิดจะทำลายสิ่งอื่น ๆ แต่สคริปต์คือสิ่งที่ฉันสังเกตเห็น


0

ฉันใช้ตัวอย่างนี้ในของฉัน.profileก่อนที่จะเริ่มต้นเปลือกใด ๆ เริ่มต้น: 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 }

จากนั้นถ้าไม่มีการรันหน้าจอเซสชันฉัน…ดีฉันไม่ตกอยู่ในการแจ้งให้เชลล์มาตรฐาน มีอีกหนึ่งพรอมต์สำหรับรหัสผ่านsudo(ตั้งแต่ 99% ของเวลาที่ฉันเข้าสู่ระบบเพื่อจัดการเซิร์ฟเวอร์) และถ้าฉันวางแผนที่จะทำงานที่มีความยาวฉันจะยกเลิกการเข้าสู่ระบบ sudo เปิดหน้าจอด้วยตนเองในเซสชันผู้ใช้ของฉัน

จุดสำคัญที่นี่คือ "ก่อนการเริ่มต้นเชลล์ใด ๆ " ดังนั้นเมื่อคุณมีเซสชั่นหน้าจอที่กำลังทำงานอยู่มันจะเริ่มต้นด้วยโลแคลและสิ่งอื่น ๆ และคุณไม่จำเป็นต้องทำซ้ำอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.