Bash
關閉並重新啟動螢幕 - 最終被欺騙!
#!/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
使用名稱創建一個新的螢幕會話- 如果它不存在,仍然創建螢幕!
不知道發生了什麼或為什麼它不起作用。我究竟做錯了什麼?
我得到了這個與一些修改工作:
#!/bin/bash set -o 名詞集 # 設置 -o 直立 # trap 'echo "由於 $LINENO 上的錯誤退出而中止。退出程式碼:$?" >&2' 錯誤 設置-o errtrace 設置-o pipefail 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 退出 是 } 功能查找螢幕{ 結果=$(螢幕 -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦 "[0-9]*\.$1" --color=NEVER -m 1) 如果 [ -z $result ]; 然後 迴聲“$ 1” 返回 1 別的 回顯$結果 返回 0 是 } target_screen=$(find_screen $SCR) 主要“$@”
- 我註釋掉了以下兩行:
豎起 trap 'echo "由於 $LINENO 上的錯誤退出而中止。退出程式碼:$?" >&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
變數來稍微更新它,將它分配給您的原始測試條件。結果更新如下:結果=$(螢幕 -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦 "[0-9]*\.$1" --color=NEVER -m 1) 如果 [ -z $result ]; 然後 迴聲“$ 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