Como posso testar se a saída de um comando é nula ou vazia? [fechadas]

1

Estou tentando obter um script de gancho pré-commit para trabalhar em nossa antiga caixa SVN. É muito antigo, rodando o Ubuntu Server 8.04.

Este script:     @echo off     ::     :: Pára commits que possuem mensagens de log vazias.     ::

@echo off

setlocal

rem Subversion sends through the path to the repository and transaction id
set REPOS=%1
set TXN=%2

rem check for an empty log message
svnlook log %REPOS% -t %TXN% | findstr . > nul
if %errorlevel% gtr 0 (goto err) else exit 0

:err
echo. 1>&2
echo Your commit has been blocked because you didn't give any log message 1>&2
echo Please write a log message describing the purpose of your changes and 1>&2
echo then try committing again. -- Thank you 1>&2
exit 1

Eu acho que não está funcionando porque o comando findstr não existe. O que funciona é isso:

if [[ -n "" ]] ; then echo "yes"; else echo "no"; fi

Então eu mudei o script para:

@echo off
::
:: Stops commits that have empty log messages.
::

@echo off

setlocal

rem Subversion sends through the path to the repository and transaction id
set REPOS=%1
set TXN=%2

rem check for an empty log message
::svnlook log %REPOS% -t %TXN% | findstr . > nul
::if %errorlevel% gtr 0 (goto err) else (goto exitgood)

::svnlook log %REPOS% -t %TXN% | findstr . > ""
::if %errorlevel% gtr 0 (goto err) else (goto exitgood)

SET LOG='svnlook log %REPOS% -t %TXN%'

if [[ -n %LOG%  ]]; then
        (goto exitgood)
else
        (goto err)
fi

:err
echo. 1>&2
echo Your commit has been blocked because you didn't give any log message 1>&2
echo Please write a log message describing the purpose of your changes and 1>&2
echo then try committing again. -- Thank you 1>&2
exit 1

:exitgood
exit 0

Mas isso não funciona, ambos saem com o código 255. Alguém pode me dizer o que estou fazendo errado?

    
por RoboJ1M 07.05.2013 / 11:45

1 resposta

3

Esses são scripts em lote - como no lote do Microsoft Windows. FINDSTR foi introduzido no Windows NT 4 Resource Kit.

:: e rem são comentários. (Ou :: é, na verdade, um rótulo com o nome inválido ).

Você provavelmente poderia executá-los com wine cmd , mas seria melhor portá-los para algum script nativo (perl, python, bash, etc.).

Exemplo simples:

#!/bin/bash

# Function to print usage and exit
usage()
{
    printf "Usage: %s [repository] [transaction_id]\n" $(basename "$1") >&2
    exit 1
}

# Check that we have at least 2 arguments
[ $# -ge 2 ] || usage

repo="$2"
trans_id="$2"

# Check that command succeed, and set variable "msg" to output
if ! msg="$(svnlook log "$repo" -t "$trans_id")"; then
    printf "Check path and id.\n" >&2
    usage
fi

# If msg is empty
if [ "$msg" = "" ]; then
    printf \
"Your commit has been blocked because you didn't give any log message
Please write a log message describing the purpose of your changes and
then try committing again. -- Thank you.\n" >&2
     exit 2    
fi

# Else default exit AKA 0
    
por 07.05.2013 / 14:26