kshで最後に実行されたコマンドラインを取得する

kshで最後に実行されたコマンドラインを取得する

ksh スクリプト内で最後に実行されたコマンドを引数と一緒に取得する方法はありますか? 私は cygwin で mksh を使用しています。

試してみましたfc -nl -1が、スクリプトで「“fc: history functions not available”」というエラーが発生します。

BASH_COMMANDksh にはこの変数に相当するものが見つかりません。

以下はスクリプトからの抜粋です:

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

trap trapper ERR

grep -ic textdoesntexist test3

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 スクリプトが壊れる可能性があります。

関連情報