Ksh

獲取 ksh 中最後執行的命令行

  • February 27, 2014

有沒有辦法將最後執行的命令與 ksh 腳本中的參數一起獲取?我正在將 mksh 與 cygwin 一起使用。

我試過fc -nl -1了,但腳本拋出了“fc:歷史函式不可用”錯誤。

BASH_COMMAND在 ksh 中看不到等效的變數。

這是腳本的摘錄:

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

trap trapper ERR

grep -ic textdoesntexist test3

一旦 grep 返回 1 ,trapper 就會執行,但我得到一個 fc: history functions not available 錯誤。

正如Lee 所指出的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

它有效,但我覺得它很醜陋。有沒有更好的出路?

mksh作者在這裡☻

fc內置實用程序訪問互動式命令行歷史記錄。正如您可能已經從名稱中猜到的那樣,這不適用於腳本,因為它們的解析方式不同(效率更高)。

一般來說,在腳本中,無論如何,你總是可以知道最後一行;)

如果您需要訪問互動式 shell 的歷史記錄,請定義一個別名,或者最好在.profileor中定義一個函式.mkshrc

在您的特定情況下,我建議使用顯式錯誤處理,例如:

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

並且 真正避免使用 GNU bash 兼容性習慣用法&>作為重定向運算符;-o posix它只是為了兼容性,而不是新腳本,並且已經在模式下消失了。解析它可能會破壞現有的有效 POSIX 腳本。

引用自:https://unix.stackexchange.com/questions/93538