Obter a última linha de comando executada no ksh

2

Existe uma maneira de obter o último comando executado possivelmente junto com os argumentos dentro de um script ksh? Eu estou usando mksh com cygwin.

Eu tentei fc -nl -1 , mas o script lança um erro "" fc: history functions not available ".

Não vejo um equivalente da variável BASH_COMMAND no ksh.

Aqui está o trecho do script:

function trapper ()
{
  printf "culprit: "
  fc -nl -1
}

trap trapper ERR

grep -ic textdoesntexist test3

o trapper é executado quando o grep retorna 1, mas eu recebo um erro fc: history functions not available.

Como destacado por Lee , hist pode ser útil, mas é disponível somente com o ksh93 , que não tenho permissão para usar.

Eu tentei armazenar a string da linha de comando em uma variável e usar essa variável dentro da função de captura.

function err_handler
{
        echo "ERR in ${cmd} trapped"
        cmd=
        return 0
}

trap err_handler EXIT ERR

cmd="grep -ic testdoesntexist test3"
${cmd} &>/dev/null

Funciona, mas eu acho que é feio. Existe uma saída melhor?

    
por user917279 04.10.2013 / 10:06

1 resposta

1

mksh autor aqui ☻

O utilitário interno fc acessa o histórico interativo da linha de comando. Como você já deve ter adivinhado pelo nome, isso não está disponível para scripts, pois eles são analisados de maneira diferente (muito mais eficiente).

Em geral, em um script, você pode sempre conhecer a última linha, de qualquer maneira;)

Se você precisar acessar o histórico de um shell interativo, defina um alias ou, de preferência, uma função em .profile ou .mkshrc .

No seu caso específico, sugiro usar o tratamento explícito de erros, algo como:

grep -ic textdoesntexist test3 || die 'Could not grep in test3'

E por favor realmente evite usar o idioma de compatibilidade bash do GNU usando &> como um operador de redirecionamento; está disponível apenas para compatibilidade, não para novos scripts e desaparece no modo -o posix . Analisá-lo pode quebrar scripts POSIX válidos existentes.

    
por 27.02.2014 / 14:45