วิธีสร้างเซสชัน tmux ใหม่หากไม่มีอยู่


144

ฉันกำลังพยายามหาวิธีแนบกับ a tmux sessionถ้ามีเซสชัน tmux ที่มีชื่ออยู่หากไม่ใช่ฉันต้องการสร้างใหม่ด้วยชื่อที่กำหนด

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

  • tmux attach แนบกับเซสชันที่มีอยู่โดยอัตโนมัติ - แต่เกิดข้อผิดพลาดหากไม่มีเซสชันอยู่
  • tmux new สร้างเซสชันใหม่ - แต่ทำทุกครั้งดังนั้นฉันจึงไม่สามารถทิ้งไว้ใน .tmux.conf
  • tmux has-session ทดสอบว่ามีเซสชันอยู่หรือไม่ แต่ฉันไม่ทราบวิธีการต่อประสานเข้ากับคำสั่งอื่น

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

ฉันจะเขียนสคริปต์อัตโนมัติเพื่อสร้างเซสชัน tmux ใหม่ได้อย่างไร (หากไม่มีชื่อเซสชันที่กำหนดไว้) หรือแนบกับชื่อเซสชัน (ถ้ามี)


15
@kzh: ฉันคิดว่ามันเป็นคำถามเครื่องมือการเขียนโปรแกรมเช่น vim
rampion

6
ฉันได้เขียนคำตอบที่เป็นไปได้อื่น ๆ สำหรับคำถามนี้เป็นส่วนสำคัญในกรณีของทุกคนที่สนใจ: gist.github.com/chakrit/5004006
ชาคริต

9
ในขณะเดียวกันฉันman tmuxพูดว่า: "ธง -A ทำให้เซสชั่นใหม่ทำตัวเหมือนแนบเซสชันถ้ามีชื่อเซสชั่นอยู่แล้ว"
Petr Viktorin

1
สำหรับการตั้งค่าสถานะเพื่อย้ายสิ่งนี้ฉันควรทราบว่าแม้ผู้ดำเนินรายการจะไม่สามารถย้ายคำถามที่มีอายุมากกว่า 60 วันไปยังไซต์อื่นได้ เหตุผลในการขีด จำกัด ของระบบนี้มีการอธิบายที่นี่
แบรดลาร์สัน

1
@BradLarson ปัจจุบันที่ดีที่สุด / ตัวเลือกที่ง่ายที่สุดในการทำเช่นนี้เป็นคำตอบในความคิดเห็นทางลง: stackoverflow.com/questions/3432536/... ผู้ใช้ส่วนใหญ่ที่มาที่นี่จะไม่สามารถค้นหาสิ่งนี้ได้ เห็นได้ชัดว่านี่เป็นคำถามที่สำคัญมากอย่างที่คุณเห็นจากจำนวนคะแนน เป็นไปได้ไหมที่จะเปิดคำถามนี้เพื่อที่ฉันจะได้เพิ่มเข้าไปในคำตอบเพื่อให้คนใหม่สามารถค้นพบสิ่งนี้
alpha_989

คำตอบ:


89

หรือคุณสามารถเพิ่ม

new-session

เพื่อคุณ .tmux.conf - ที่จะสร้างเซสชั่นเริ่มต้นในการเริ่มต้นเซิร์ฟเวอร์

จากนั้นtmux attachจะแนบกับเซสชันปัจจุบัน (เรียกใช้เซิร์ฟเวอร์นั่นคือ) หรือสร้างเซสชันใหม่ (เริ่มเซิร์ฟเวอร์อ่านไฟล์กำหนดค่าออกnew-sessionคำสั่ง) และแนบไฟล์นั้น


3
เมื่อสิ่งนี้สร้างเซสชันใหม่พา ธ ดีฟอลต์คือโฮมไดเร็กทอรีของฉันไม่ใช่พา ธ ที่เรียกใช้ tmux
Richard Hansen

2
@AB: คำตอบใดที่คุณหมายถึง?
Jürgen A. Erhard

มีวิธีใดที่จะแก้ไขปัญหาของ @ RichardHansen ได้หรือไม่ การกล่าวอ้างจากเส้นทางปัจจุบันดูเหมือนว่าเหมาะสมที่สุดและหากnew-sessionทำลายสิ่งนั้นดูเหมือนว่าจะเป็นปัญหาจริง
Lee Olayvar

2
สิ่งนี้จะหยุดการโหลดการกำหนดค่า tmux ในกรณีที่คุณใช้ ( source-file ~/.tmux.conf)
Sebastian Blask

11
@SebastianBlask คุณสามารถใช้-Aตัวเลือกnew-sessionหากคุณตั้งชื่อเซสชันของคุณ new-session -A -s mysessionจะเล่นเป็นอย่างดีด้วยการโหลดการกำหนดค่า
jkoelker

163

ฉันคิดออก ( และมันชี้ให้ฉัน )

tmux attach || tmux new

28
tmux attach-session -t my-session || tmux new-session -s my-sessionคำตอบนี้ทำงานได้ดีสำหรับฉันเพราะฉันสามารถตั้งชื่อเซสชั่น: ปัญหาเดียวคือมันไม่ได้เป็นอะตอม tmux ควรมีคำสั่งสร้างหรือแนบ
Andrew

5
ฉันมีนามแฝงต่อไปในทุบตี -alias tm='tmux attach || tmux new'
azat

10
Upvoting tmux attach -t some_name || tmux new -s some_nameเพราะมีขนาดเล็กปรับแต่งผลงานนี้มีการประชุมชื่อ: เปลี่ยน some_name เป็น $ 1 เพิ่ม shebang และบันทึก
Cheezmeister

10
หมายเหตุผู้ที่ไม่คุ้นเคยกับ tmux และสงสัยเกี่ยวกับnewVS new-sessionพวกเขามีความหมายเหมือนกันและเพื่อให้มีและattach attach-session
Esteis

1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaultทำงานได้ดีกว่าและไม่เปิด tmux ตัวที่สองในกรณีที่คุณ/bin/killเป็นคนแรก ข้อเสียเพียงอย่างเดียวคือคุณต้องตั้งชื่อเซสชันสำหรับสิ่งนี้
Tino

64

ตามที่ระบุไว้ในความคิดเห็นจากPetr Viktorin , jkoelkerและpjinczคุณสามารถใช้คำสั่งต่อไปนี้เพื่อแนบmySessionหากมีอยู่และเพื่อสร้างหากไม่ได้:

 tmux new -A -s mySession

จากman tmux:

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(นามแฝง: new)

สร้างเซสชั่นใหม่ที่มีชื่อsession-name

[ ... ]

-Aธงทำให้new-sessionประพฤติเช่นattach-sessionถ้าsession-nameมีอยู่แล้ว; ในกรณีนี้-Dจะทำงานเหมือนการ-dattach-session

new-sessionได้ให้การสนับสนุน-Aตั้งแต่ tmux-1.8


1
หากคุณกำลังจะใช้สิ่งนี้ในรูปแบบที่gnome-terminalเป็นคำสั่งที่ฉันขอแนะนำให้เลิกใช้-sและชื่อเซสชันเฉพาะเพื่อที่คุณจะได้ไม่ต้องจบgnome-terminalเซสชันใหม่ทุกครั้งที่เชื่อมต่อกับเซสชันเดียวกัน คุณสามารถเลือกเซสชันที่มีอยู่ด้วยprefix + sหลังจากเปิดเทอร์มินัลใหม่
dragon788

14

แม้ว่าฉันจะพบว่าคำตอบของ rampion นั้นเพียงพอสำหรับการใช้งาน 1 ครั้ง แต่สคริปต์นี้ให้คุณตั้งค่าหลายเซสชัน:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

บันทึก:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 

13

การปรับข้อเสนอแนะของ Alex เพื่อรวมการกำหนดค่าโครงการตามเมื่อเริ่มต้นฉันเริ่มใช้สิ่งต่อไปนี้:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

tmux-myproject.confซีรีย์เริ่มต้นของคำสั่ง tmux ของฉันอยู่ที่ไหนเพื่อสร้างหน้าต่างและบานหน้าต่างรวมถึงเริ่มบรรณาธิการของฉัน


8

ฉันใช้นามแฝงเพื่อสร้างเซสชันใหม่หากจำเป็นและแนบกับเซสชันเริ่มต้นของฉันหากมีอยู่แล้ว:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

ฉันได้เพิ่มสิ่งนี้ลงใน .login ของฉันบนเซิร์ฟเวอร์ของฉัน

เหตุผลที่ฉันทำแบบนี้เพราะฉันไม่ต้องการแนบกับเซสชันจริงเดียวกันฉันต้องการเซสชันใหม่ซึ่งใช้กลุ่มหน้าต่างเดียวกัน

screen -xRRนอกจากนี้ยังมีความคล้ายคลึงกับการทำงาน


2
tmux list-sessionsถ้าคุณอยู่ในและออกจากเซสชันของคุณมักจะใบนี้จำนวนมากของการประชุมที่ไม่ได้ใช้เท่าที่เห็นโดย
Anm

ใช่แล้วฉันเพิ่งทำความสะอาดพวกเขาทุกครั้งแล้ว มันเป็นข้อเสียเปรียบเล็กน้อยที่จะได้รับฟังก์ชั่นที่ฉันต้องการ
ไมเคิล

สวัสดี @ mateusz-piotrowski - ฉันเห็นด้วยกับการแก้ไขเพื่อห่อรหัสของฉันในบล็อกรหัส แต่ทำไมคุณจะแก้ไขข้อความอื่นจะแตกต่างจากที่ฉันพูด? ขออภัยที่จะแสดงความคิดเห็นที่นี่ แต่ฉันไม่เห็นที่อื่น
Michael

ฉันไม่ได้ตั้งใจจะทำร้ายคุณ ฉันแค่คิดว่าคุณไม่สามารถเรียกใช้นามแฝงในไฟล์กำหนดค่าได้ดังนั้นจึงต้องเป็นตัวพิมพ์ผิด
Mateusz Piotrowski

3
ถึงตอนนี้คุณสามารถพิมพ์: tmux new -A -s defaultเพื่อเปิดเซสชันใหม่หากไม่มีอยู่หรือแนบอัตโนมัติ ฉันคิดว่ามันดีกว่าการแก้ไขไฟล์ปรับแต่ง
pjincz

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