#!/bin/bash
set -o nounset
set -o errexit
trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR
set -o errtrace
set -o pipefail
SCR="bunny"
SCRIPT="/home/../run.sh"
main() {
if find_screen $SCR >/dev/null; then
close_screen
start_script
fi
}
function start_script {
echo "Starting script with new screen"
screen -d -m -t $SCR sh $SCRIPT
}
function close_screen {
if find_screen $SCR >/dev/null; then
echo "Found! Deleting $SCR"
screen -S -X $target_screen quit
fi
}
function find_screen {
if screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 -q >/dev/null; then
screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 2>/dev/null
return 0
else
echo "$1"
return 1
fi
}
target_screen=$(find_screen $SCR)
main "$@"
我正在尝试创建一个重新启动特定屏幕的脚本。现在,脚本确实启动了屏幕,但它还创建了另一个带有两个点的屏幕1234..randomName
。
该脚本的目标是:
- 检查屏幕是否存在
- 如果存在,关闭屏幕
SCRIPT
使用名称创建一个新的屏幕会话- 如果不存在,仍然创建屏幕!
不确定发生了什么或者为什么它不起作用。我究竟做错了什么?
答案1
我通过一些修改使它可以工作:
#!/bin/bash set -o 名词集 # 设置-o errexit # trap 'echo "由于 $LINENO 行上的 errexit 而中止。退出代码:$?" >&2' 错误 设置错误跟踪 设置-o管道故障 SCR=“兔子” 脚本=“/home/../run.sh” 函数主() { 如果 find_screen $SCR >/dev/null;然后 关闭屏幕 启动脚本 菲 } 函数开始脚本{ echo“使用新屏幕启动脚本” 屏幕-d -m -S $SCR sh $SCRIPT } 函数关闭屏幕{ 如果 find_screen $SCR >/dev/null;然后 echo“找到!删除$SCR” 屏幕 -S $target_screen -X 退出 菲 } 函数 find_screen { 结果=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦“[0-9]*\.$1”--color=NEVER -m 1) if [ -z $结果 ];然后 回显“$1” 返回1 别的 回显$结果 返回0 菲 } target_screen=$(find_screen $SCR) 主要“$@”
- 我注释掉了以下两行:
设置错误退出 trap 'echo“由于 $LINENO 行上的 errexit 而中止。退出代码:$?” >&2' 错误
这些行干扰了您return 1
在find_screen function
- 在
close_screen
功能中,screen -S -X $target_screen quit
需要稍作修改:screen -S $target_screen -X quit
将开关与相应的参数相匹配。
if
函数中的语句永远find_screen
不会返回 true,因此我通过添加一个results
变量对其进行了轻微更新,并将其分配给原始测试条件。更新结果如下:
结果=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦“[0-9]*\.$1”--color=NEVER -m 1) if [ -z $结果 ];然后 回显“$1” 返回1 别的 回显$结果 返回0 菲
其他项目
- 如果您希望根据 $SCR 变量命名屏幕,则需要使用开关
-S
,如下所示
screen -d -m -S $SCR
...并根据需要添加任何其他参数和开关。
- 在
start_script
函数中,看起来您正在尝试使用开关-t
,而不是-S
-
screen -d -m -t $SCR sh $SCRIPT
根据您的描述,“使用 SCRIPT 名称创建一个新的屏幕会话" 您将用于-S
设置屏幕会话名称。您可以将其与-t
设置窗口名称结合起来,因为屏幕会话中可能有多个窗口:screen -d -m -S $SCR -t
WindowName1