Eu consegui isso para trabalhar com algumas modificações:
#!/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" function 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 -S $SCR sh $SCRIPT } function close_screen { if find_screen $SCR >/dev/null; then echo "Found! Deleting $SCR" screen -S $target_screen -X quit fi } function find_screen { result=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1) if [ -z $result ]; then echo "$1" return 1 else echo $result return 0 fi } target_screen=$(find_screen $SCR) main "$@"
- Comentei as duas linhas a seguir:
set -o errexit trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR
Essas linhas estavam interferindo na sua declaração return 1
no find_screen function
- Na função
close_screen
,screen -S -X $target_screen quit
precisava de uma pequena modificação:screen -S $target_screen -X quit
para corresponder aos comutadores com os respectivos parâmetros.
A instrução if
na função find_screen
nunca retornou true, então atualizei-a ligeiramente adicionando uma variável results
, atribuindo-a à sua condição de teste original. A atualização resultante é a seguinte:
result=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1) if [ -z $result ]; then echo "$1" return 1 else echo $result return 0 fi
Outros itens
- Se você deseja nomear sua tela com base na variável $ SCR, é necessário usar a opção
-S
, como em
screen -d -m -S $SCR
... e adicione quaisquer outros parâmetros e opções, conforme desejado.
- Na função
start_script
, parece que você está tentando usar a opção-t
, em vez de-S
, emscreen -d -m -t $SCR sh $SCRIPT
- com base em sua descrição, " criar uma nova sessão de tela com nome de SCRIPT "você usaria-S
para definir o nome da sessão de tela. Você pode combinar isso com-t
para definir o nome da janela, pois você pode ter várias janelas em uma sessão de tela:screen -d -m -S $SCR -t
WindowName1