Есть ли способ получить последнюю выполненную команду вместе с аргументами в скрипте 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.