ฉันจะบอกได้อย่างไรว่าฉันอยู่ในเซสชั่น tmux จากสคริปต์ทุบตี?


53

ฉันชอบที่จะเก็บไว้bash_profileในที่เก็บคอมไพล์และโคลนมันกับเครื่องที่ฉันเข้าถึงเชลล์ได้ เนื่องจากฉันtmuxใช้เวลาส่วนใหญ่ฉันมีuser@hostสตริงในบรรทัดสถานะแทนที่จะเป็นจุดดั้งเดิมในเชลล์พรอมต์

มีบางเว็บไซต์ที่ฉันใช้tmuxติดตั้งไว้หรือฉันอาจไม่ได้ใช้งาน ฉันต้องการตรวจสอบเมื่อฉันไม่ได้อยู่ในtmuxเซสชั่นและปรับพรอมต์ของฉันตาม จนถึงตอนนี้วิธีการแก้ปัญหาของฉันที่อบในตอนนี้.bash_profileดูเหมือนว่า

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(การตรวจสอบทุกครั้งอาจไม่ใช่วิธีที่ดีที่สุดดังนั้นฉันจึงเปิดรับข้อเสนอแนะสำหรับวิธีที่ดีกว่าในการทำเช่นนี้การสคริปต์ Bash ไม่ใช่มือขวาของฉัน)

คำตอบ:


72

Tmux กำหนดTMUXตัวแปรสภาพแวดล้อมในการประชุม tmux และชุดที่จะTERM screenนี่ไม่ใช่ตัวบ่งชี้ที่เชื่อถือได้ 100% (ตัวอย่างเช่นคุณไม่สามารถบอกได้อย่างง่ายดายว่าคุณกำลังวิ่งscreenอยู่ข้างในtmuxหรือtmuxข้างในscreen) แต่ควรจะดีพอในทางปฏิบัติ

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

หากคุณต้องการรวมสิ่งนั้นไว้ในชุดคำสั่งที่ซับซ้อนผ่านPROMPT_COMMAND(ซึ่งเป็นการตั้งค่า bash โดยวิธีการดังนั้นไม่ควรส่งออก):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

หากคุณจำเป็นต้องทดสอบว่ามีการติดตั้ง tmux หรือไม่:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

โดยวิธีการทั้งหมดนี้ควรเข้าไป~/.bashrcไม่ใช่~/.bash_profile(ดูความแตกต่างระหว่าง. bashrc และ. bash_profile ) ~/.bashrcถูกเรียกใช้ในทุกอินสแตนซ์ของ bash และมีการกำหนดเชลล์เองเช่นพรอมต์และชื่อแทน ~/.bash_profileจะทำงานเมื่อคุณเข้าสู่ระบบ (หากเปลือกเข้าสู่ระบบของคุณเป็นทุบตี) แปลกทุบตีไม่ได้อ่าน~/.bashrcในเปลือกเข้าสู่ระบบดังนั้นคุณ~/.bash_profileควรมี

case $- in *i*) . ~/.bashrc;; esac

มีตัวแปรทางเลือกTMUX_PANEเช่นกัน ฉันสังเกตเห็นเพียงเพราะสูตรของคุณไม่ทำงาน ต่อมาฉันพบว่าฉันได้ใช้unsetตัวแปร(และต่อมา) ในเชลล์สคริป.profileอย่างไม่เหมาะสม
0xC0000022L

[ "$TERM" = "screen" ]อาจไม่ทำงาน ในกรณีของฉันหน้าจอของฉันรายงานเป็นscreen-256สี
StevieD

@ StevieD ฉันไม่คิดว่า tmux จะทำสิ่งนี้ด้วยตัวเอง แต่อาจเป็นแพทช์การกระจายหรือการกำหนดค่า
Gilles 'หยุดความชั่วร้าย'

2

หลังจากลองใช้วิธีที่ต่างกันนี่คือสิ่งที่ได้ผลในที่สุดสำหรับฉันในกรณีที่มันช่วยทุกคนที่นั่น:

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

ในข้อมูลโค้ดนี้ฉันตรวจสอบว่าเราไม่ได้อยู่ในสภาพแวดล้อม TMUX หรือไม่ฉันเปิดใช้งาน หากคุณวางข้อมูลโค้ดไว้ใน.bashrcไฟล์ของคุณคุณจะรัน TMUX โดยอัตโนมัติทุกครั้งที่คุณเปิดเทอร์มินัล! PS: ทดสอบบนเชลล์ของ Ubuntu


1

สำหรับคำตอบก่อนหน้าการทดสอบ${TERM}ตัวแปรอาจนำไปสู่กรณีมุมtmuxตั้งค่าตัวแปรสภาพแวดล้อมในชีวิตของตัวเอง:

$ env | grep -i tmux
TMUX = / tmp / tmux-1000 / ค่าเริ่มต้น 4199,5
TMUX_PANE =% 9
TMUX_PLUGIN_MANAGER_PATH = / home / imil / .tmux / ปลั๊กอิน /

ในการตรวจสอบว่าคุณอยู่ในtmuxสภาพแวดล้อมเพียงตรวจสอบ:

$ [ -z "${TMUX}" ] && echo "not in tmux"

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