byobu 命令的 shell 脚本

问题描述 投票:0回答:3

需要编写一个 shell 脚本,用单独的选项卡打开

byobu
终端。第一行打开新的
byobu
会话,后续行连接到该会话并打开新选项卡。是一种自动打开终端。

前-

byobu new-session -s "Server" "redis-server"

byobu new-window "redis-cli"

byobu new-window "sudo mongod --port 27017 --dbpath /data/db/rs0 --replSet rs0"

byobu new-window "mongo"

这里的问题是,当我运行一次这个 shell 脚本时,它只运行第一个命令,然后停止。如果我再次运行它,它将执行剩余的行并显示消息:

重复会话:服务器

我在这里做错了什么?

shell scripting byobu
3个回答
7
投票

我认为您缺少 shell 脚本的第一行。看看这是否有效

#!/bin/sh
# byobu_launcher.sh ver 20170915122301 Copyright 2017 alexx, MIT Licence ver 1.0

byobu new-session -d -s $USER

# redis window
byobu rename-window -t $USER:0 'redis-cli'
byoby send-keys "redis-cli" C-m
byobu split-window -v

# mongod
byobu new-window -t $USER:1 -n 'mongod'
byobu send-keys "sudo mongod --port 27017 --dbpath /data/db/rs0 --replSet rs0" C-m

# mongo
byobu new-window -t $USER:1 -n 'mongo'
byobu send-keys "mong" C-m

# Set default window as the dev split plane
byobu select-window -t $USER:1

# Attach to the session you just created
# (flip between windows with alt -left and right)
byobu attach-session -t $USER

对于 screen,您可以通过添加到 ~/.screenrc 的末尾来完成此操作

screen -t redis-cli 0
stuff "redis-cli\n"
screen -t mongod 1
stuff "sudo mongod --port 27017 --dbpath /data/db/rs0 --replSet rs0\n"
screen -t mongo 2
stuff "mongo\n"
select 1

我主要使用 screen,有时也使用 tmux。我没用过byoby。


1
投票

我之前写过这篇文章,也许对你有帮助 注释很少,但是函数有明显的名字

#!/bin/bash

# create terminals and rename




function extract_session() {
    arg=$1
    [[ ! "${line:0:1}" = "[" ]] && echo Not a session block && exit 1
    [[ ! "${line: -1}" = "]" ]] && echo Not a session block && exit 1
    echo "${arg:1:-1}"
}

function new_session(){
    sess=$1
    if [[ $(byobu has-session -t ${sess} &> /dev/null; echo $?) -eq 0 ]] 
    then
      echo Session ${sess} already exists
    else
      printf "Starting new session %s\n" "${sess}"
      byobu new-session -d -s ${sess}
    fi
}

function new_window(){
    win=$1
    printf "Window %s: %s\n" "${win_id}" "${win}"
    if [[ ${win_id} -eq 0 ]]
    then
    byobu rename-window -t ${win_id} ${win}
    else
    byobu new-window -n ${win} 
    fi
    byobu select-pane -t ${pane_id} -T ${win}
}

function new_pane(){
    pane_name=$1
    printf "\t%s\t%s %s\n" ${pane_id} "${pane_name}" "${split}"
    byobu select-window -t ${win_id}
    byobu split-window ${split}
    byobu select-pane -t ${pane_id} -T ${pane_name}
    
}

while read line
do
    if [[ "${line:0:1}" = "[" ]]
    then
    # begin SESSION
    SESSION=$(extract_session ${line})
    new_session ${SESSION}
    win_id=0
    else
    pane_id=0
    # create windows with panes
    for pane in ${line[@]}
    do
        if [[ "${pane:0:1}" = "|" ]]
        then
        # create horizontal pane
        pane=${pane: 1}
        split=-h
        else
        # create vertical pane
        split=-v
        fi
        if [[ ${pane_id} -eq 0 ]]
        then
        new_window ${pane}
        else
        new_pane ${pane}
        fi
        pane_id=$((pane_id+1))
    done
    win_id=$((win_id+1))
    printf "\n"
    fi
    
done <<EOF
[guake]
ipython
sam |sam
ROOT iROOT
scp
TDOD
vpn
[joplin]
[RTERM]
sam
ROOT
man
[xterm]
monitor | htop | net
ROOT
man
[LTERM]
sam
ipython
ROOT
man
[DEV]
iPython |tail |run
run2
help
auto-scp
django
django-srv
[ansible]
playbook
inventory
[SSH]
ssh
[SSH2]
ssh
[SSH3]
ssh

EOF

底部的部分是此处文档,您可以在其中使用窗格添加会话名称。 我还想添加某些应该执行的命令,但我已经做到了


0
投票

以下脚本将启动一个名为

DEV
的默认会话,由 4 个分片组成,在右上角的分片上运行命令。

如果此会话存在,它会询问我们是否应该打开它,或者杀死它并开始一个新会话。

通过在命令行中传递参数,我们可以将会话

DEV
更改为任意。

#!/bin/bash
pwn() {
    local session_name=$1
    byobu new-session -d -s "$session_name" 
    byobu select-pane -t 0
    byobu split-window -v
    byobu select-pane -t 1
    byobu split-window -h
    byobu select-pane -t 0
    byobu split-window -h
    byobu select-pane -t 1
    byobu send-keys "top" Enter
    byobu attach -t "$session_name"
}
if [ $# -eq 1 ]; then
    session_name=$1
else
    session_name="DEV"
fi

if tmux has-session -t "$session_name" 2>/dev/null; then
    echo "Session $session_name already exists."
    echo "Open it (ENTER)"
    echo "Or kill and start a new $session_name session? (K/k):"
    read -p "? " choice
    if [ "$choice" = "K" ] || [ "$choice" = "k" ]; then
        tmux kill-session -t "$session_name" 
        pwn "$session_name"
    else
        byobu attach -t "$session_name"
    fi
else
    pwn "$session_name"
fi

# Starts or reopen a DEV session
./mybyobyscript 
# Starts or reopen a PROJECT5 session
./mybyobyscript PROJECT5

受到 https://askubuntu.com/a/1062108 byobu 命令的启发。

© www.soinside.com 2019 - 2024. All rights reserved.