ฉันจะตั้งค่าเปลือกเริ่มต้นให้เริ่มต้น tmux ได้อย่างไร


คำตอบ:


46

ดูเหมือนว่าจะทำงาน ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

เพียงเพิ่มรหัสทุบตีต่อไปนี้ใน. bashrc ของคุณต่อหน้านามแฝง รหัสสำหรับเปลือกอื่น ๆ คล้ายกันมาก:

[[ $TERM != "screen" ]] && exec tmux

2
สำหรับฉันนี้ยังจำเป็น[[ $- != *i* ]] && returnที่จะไม่เป็นห่วงอนันต์ (จากหน้าเดียวกัน)
คี ธ ยิ้ม

5
นี่คือวิธีการแก้ปัญหาที่ไม่ดีตั้งแต่TERMอาจจะมีการตั้งค่าอื่น ๆ บางอย่างโดยผู้ใช้.tmux.confไฟล์ ดีกว่าที่จะตรวจสอบว่าTMUXตัวแปรถูกตั้งค่าหรือไม่
Kusalananda

104

@ คำตอบของ StarNamer นั้นถูกต้อง แต่โดยทั่วไปแล้วฉันจะรวมการทดสอบต่อไปนี้เพื่อให้แน่ใจว่า (1) tmux มีอยู่ในระบบ (2) เราอยู่ในเชลล์แบบโต้ตอบและ (3) tmux ไม่พยายามทำงานภายใน ตัวเอง:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

อ้างอิง


1
ดีฉันต้องการcommandมาก่อน แต่ไม่รู้ว่ามันมีอยู่จริง
Freedom_Ben

2
นี้execคำสั่งไม่อนุญาตให้คุณออกจาก tmux โดยไม่ต้องลาออกจากสถานีทั้งหมด! : |
Louis Maddox

5
@LouisMaddox: execแทนที่กระบวนการปัจจุบันด้วยกระบวนการใหม่ - ในกรณีนี้จะแทนที่เชลล์ล็อกอิน bash ด้วย tmux ดังนั้นเมื่อ tmux ออกจากนั้นไม่มีเทอร์มินัลอื่นที่จะถอยกลับไปเป็น :)
Mark K Cowan

1
@rjt ถูกต้องนี่เป็นการเริ่มเซสชันใหม่ด้วยการออกแบบ หากคุณต้องการที่จะแนบไปกับเซสชั่น tmux ที่มีอยู่ก็แทนที่exec tmuxด้วยรสชาติที่คุณต้องการของtmux attach
user7089

2
แทนที่จะexec tmuxใช้exec tmux new-session -A -s mainดังนั้นฉันจะมีเซสชันที่เรียกว่า main และแนบไว้เสมอ (แทนที่จะสร้างใหม่ทุกครั้งที่ฉันเชื่อมต่อกับเครื่องระยะไกลของฉัน) แต่จะไม่เกิดปัญหาเหมือนกับการใช้tmux attachในกรณีที่ไม่มีเซสชัน (พบได้ที่นี่: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid

16

การเพิ่มบรรทัดเช่น

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

ในไฟล์ bashrc ของคุณอาจจะทำงานได้ หมายเหตุบรรทัดนี้จะออกจาก ssh และยุติการเชื่อมต่อเมื่อคุณถอดหรือออกจาก tmux ฉันชอบการกำหนดค่านี้เนื่องจากจะช่วยประหยัดการกดปุ่มเพื่อยกเลิกการเชื่อมต่อ แต่ถ้าคุณไม่รักสิ่งนี้ (ซึ่งฉันคิดว่าไม่น่าจะเป็นไปได้มาก) และจะยังคงอยู่ในเชลล์การเข้าสู่ระบบหลังจากการเลิกจ้างเพียงแค่ลบexitส่วน:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

นอกจากนี้โปรดทราบว่าคุณไม่ควรห่อtmux attachด้วยexecเพราะจะทำให้การเชื่อมต่อถูกปิดเมื่อไม่มีเซสชัน tmux ที่จะแนบ


ฉันได้เพิ่มบรรทัดนี้ใน. bashrc ของฉัน แต่ตอนนี้เมื่อฉันเริ่มต้นเทอร์มินัลฉันได้รับข้อความ: /home/z/.tmux.conf:10: ไม่มีเซสชันปัจจุบัน (ข้อความซ้ำสำหรับบรรทัดที่ 11, 13, 14 , 15) บรรทัดเหล่านั้นเป็นสิ่งต่าง ๆ เช่น "set default-command" exec bash "" และ "set default-terminal" screen-256color "
Matt G

@MattG รู้สึกว่ามันผิดปกติกับไฟล์กำหนดค่า tmux
huangzonghao

5

มีคำสั่งchshที่เปลี่ยนล็อกอินเชลล์ man chshปรึกษา


6
tmuxไม่ใช่เชลล์มันเป็นเทอร์มินัลมัลติเพล็กเซอร์เช่นหน้าจอ GNU น่าสนใจมันสนับสนุน-cตัวเลือกตามหน้า manดังนั้นมันอาจทำงานเหมือนกับ shell ที่เพียงพอที่จะใช้เป็นเชลล์ล็อกอินของคุณ แต่ฉันคิดว่ามันจะไม่ทำงานอย่างถูกต้องในทุกสถานการณ์เช่นการล็อกอินแบบกราฟิกผ่าน gdm / kdm .
Mikel

1
แม้ว่าสิ่งนี้จะมีเหตุผลและได้รับการสนับสนุนจากเอกสาร แต่ดูเหมือนว่าจะทำลายการดำเนินการคำสั่งโดยตรงผ่าน SSH (คล้ายssh $some_server echo foo)
n.st

3
tmux อย่างน้อย 1.8 บน Ubuntu เพิ่มตัวเองลงไป/etc/shellsดังนั้นมันจึงเป็นเชลล์ล็อกอินที่ถูกต้อง
claytron

2
สิ่งนี้ต้องการให้คุณกำหนดการdefault-shellตั้งค่าในคอนฟิกูเรชัน tmux เพื่อชี้ไปที่เชลล์จริง
Kusalananda

4

ฉันใช้เรียบร้อยแล้ว

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

.zshrcในของฉัน หากคุณกำลังใช้ทุบตีใส่ไว้ในของคุณ.bashrcแทน


ฉันเพิ่งลองตั้งค่าtmuxเป็นเชลล์เริ่มต้นของฉัน ( chsh -s $(which tmux)) และดูเหมือนว่าจะหยุดการประมวลผลคำสั่งโดยตรงผ่าน SSH เช่นssh $some_server echo fooจะไม่สร้างผลลัพธ์ใด ๆ


3

ไปที่สิ่งที่ชอบที่สุด ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคลิกที่ปุ่ม "command" ป้อนคำอธิบายรูปภาพที่นี่

ตรวจสอบ "เรียกใช้คำสั่งที่กำหนดเองแทนการขายของฉัน" และเขียนคำสั่งใดก็ตามที่คุณต้องการดำเนินการเมื่อเริ่มต้นเครื่องของคุณ


1

คำตอบข้างต้นไม่ได้ผลสำหรับฉัน - exec tmuxป้องกันไม่ให้ฉันปิด tmux โดยไม่ต้องออกจากเชลล์ (ไม่ว่าจะเปิดด้วยCtrl+ Tหรือจากเมนูแอปพลิเคชัน)

ฉันใช้ Linux Mint ซึ่งช่วยให้คุณจับคู่คีย์ลัดกับคำสั่งและ (ยกเลิก kosher เนื่องจากอาจเป็นไปได้บางอย่าง .. ) ฉันมี bash shells พร้อมคำสั่งที่เริ่มต้นที่นั่นเช่นWin+ Alt+ Bทำbash -exec(vim)ประโยคที่ซับซ้อนแก้ไข. bashrc ของฉันดังนั้นมันจึงทำหน้าที่เหมือนเปลือกหอยปกติ

tmux .bashrcโหลดมากกว่าที่เป็นกลุ่มภายใต้สถานการณ์ที่หลังจากวางด้านบนที่ด้านบนของฉัน ฉันได้พันบรรทัดการเรียกใช้ tmux ไว้ใน if if คำสั่งตรวจสอบว่ามันกำลังทำงานในโหมดการโต้ตอบ

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

คุณสามารถห่อสิ่งนั้นไว้ในบรรทัดเดียว แต่เพื่อความสะดวกในการอ่านฉันคิดว่าไม่เป็นไร


การเพิ่มเครื่องหมายและจะแก้ไขปัญหาเช่นนั้น [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau

1

การเพิ่มคำตอบของ @Louis Maddox ฉันจะรันส่วน tmux ด้วย;

(exec tmux attach || exec tmux new-session)

ฉันใช้exec sh -c 'tmux a || tmux'ซึ่ง (หลังจากดูคำตอบของคุณ) อาจจะทำให้สิ่งเลวร้ายเกิดขึ้นถ้า tmux ไม่สามารถเริ่มด้วยเหตุผลใด ๆ ..... ขอบคุณฉันจะใช้ของคุณจากนี้เป็นต้นไป :)
Mark K Cowan

1
tmux new -A -s mysessionอาจจะทำงานด้วย
poolie

1

นี่คือของฉัน~/.profile(ฉันใช้ksh93):

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

หากTMUXตัวแปรสภาพแวดล้อมไม่ได้รับการตั้งค่า / ว่างเราก็ยังไม่ได้อยู่ในเซสชั่น tmux ดังนั้น ...

หากtmux has-sessionกลับมาพร้อมกับสถานะเป็นศูนย์ทางออก (จริง) มีเซสชันที่พร้อมใช้งานสำหรับการเชื่อมต่อ แนบไปกับมัน

ถ้าไม่สร้างเซสชันใหม่

เป็นไปได้ที่จะใช้tmuxเป็นเชลล์ล็อกอินของคุณ อย่างไรก็ตามหากคุณทำเช่นนี้ตรวจสอบให้แน่ใจว่าตั้งค่าdefault-shellเป็นเชลล์จริงใน~/.tmux.confไฟล์ของคุณ(ดูคู่มือ tmux สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้)


1

คุณสามารถ (และตอนนี้น่าจะควร) ใช้chshคำสั่งเพื่อตั้ง tmux เป็นเปลือกเริ่มต้นแล้วเพิ่มต่อไปนี้เพื่อ.tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

เพียงจำไว้ว่าให้ปรับเปลี่ยนเส้นทางที่ส่วนท้ายของบรรทัด


1

ฉันรวมการตรวจสอบอย่างละเอียดเข้ากับการตรวจสอบเซสชันตามเงื่อนไขและวางการหมุนของฉันเองเพื่อสร้างเซสชันเริ่มต้นที่เชื่อมต่อหรือสร้างขึ้น ถ้าคุณไม่ได้อยู่ในเซสชั่น tmux อื่นหรือตรงตามเงื่อนไขการป้องกันอื่น ๆ

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

ตามคำตอบเหล่านี้:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110


0

เพิ่มลงในของคุณ ~/.tmux.conf

set -g default-command /usr/local/bin/fish

1
ฉันคิดว่าคุณเข้าใจผิดคำถามเพื่อน! ;)
PhilT

-3

ดังที่ Mikel ได้กล่าวไว้ในความคิดเห็นของเขาว่ามี tmux เนื่องจากเชลล์ล็อกอินของคุณสามารถมีผลข้างเคียง แต่คุณสามารถสร้างtmuxเชลล์เริ่มต้นได้อย่างแท้จริง เชลล์เริ่มต้นของผู้ใช้ถูกกำหนดใน / etc / passwd ดังนั้นคุณสามารถรูทและแก้ไข / etc / passwd เช่นsudo vi /etc/passwdค้นหาบรรทัดที่ขึ้นต้นด้วยชื่อผู้ใช้ของคุณ :/bin/bashมันอาจจะจบลงด้วยการ เปลี่ยน / bin / bash เป็น / usr / bin / tmux และตอนนี้ tmux เป็นเชลล์ล็อกอินเริ่มต้นของคุณ

อย่างไรก็ตามไม่มีการรับประกันว่าสิ่งนี้จะไม่ทำให้เกิดปัญหา!

สิ่งที่อาจทำงานได้ดีกว่าคือการไม่ทำสิ่งใด ๆ ที่จำเป็นต้องมีสิทธิ์รูท ฉันจะพยายามสร้างไฟล์ใน directoy บ้านของฉันชื่อ. bash_login และเริ่ม tmux จากภายในไฟล์นั้น: `echo" tmux "> ~ / .bash_login

สิ่งนี้ควรใช้งานได้ แต่คุณต้องลองและค้นหาด้วยตัวเอง b / c เอกสาร bash นั้นไม่แม่นยำมากนักเกี่ยวกับไฟล์ที่อ่านและดำเนินการเมื่อใด


2
สิ่งที่ย่อหน้าแรกของคุณอธิบายคืออะไรchsh! ยกเว้นว่าวิธีการของคุณต้องเป็นรากและข้อผิดพลาดได้ง่าย วิ่งtmuxจาก.bash_loginเป็นมากขึ้นมีแนวโน้มที่จะทำลายการเข้าสู่ระบบจากระยะไกล
Gilles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.