Получить последнюю выполненную командную строку в ksh

Получить последнюю выполненную командную строку в ksh

Есть ли способ получить последнюю выполненную команду вместе с аргументами в скрипте ksh? Я использую mksh с cygwin.

Я попробовал fc -nl -1, но скрипт выдает ошибку «fc: history functions not available».

Я не вижу эквивалента этой BASH_COMMANDпеременной в ksh.

Вот отрывок из сценария:

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

trap trapper ERR

grep -ic textdoesntexist test3

Trapper выполняется, как только grep возвращает 1, но я получаю ошибку fc: history functions not available.

Какотметил Ли, histможет быть полезным, но этодоступно только с ksh93, которые мне не разрешено использовать.

Я попробовал сохранить строку командной строки в переменной и использовать эту переменную в функции-ловушке.

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

trap err_handler EXIT ERR

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

Это работает, но я думаю, что это как-то некрасиво. Есть ли лучший выход?

решение1

mkshавтор здесь ☻

Встроенная утилита fcобращается к интерактивной истории командной строки. Как вы уже догадались из названия, для скриптов это недоступно, поскольку они анализируются по-другому (гораздо эффективнее).

Вообще говоря, в сценарии вы можетевсегдапоследнюю строчку я знаю, в любом случае ;)

Если вам нужен доступ к истории интерактивной оболочки, определите псевдоним или, что предпочтительнее, функцию в .profileили .mkshrc.

В вашем конкретном случае я предлагаю использовать явную обработку ошибок, что-то вроде:

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

Ипожалуйста Действительноизбегайте использования идиомы совместимости GNU bash с использованием &>в качестве оператора перенаправления; она нужна только для совместимости, а не для новых скриптов, и уже исчезает в -o posixрежиме. Ее разбор может нарушить существующие допустимые скрипты POSIX.

Связанный контент