ksh スクリプト内で最後に実行されたコマンドを引数と一緒に取得する方法はありますか? 私は cygwin で mksh を使用しています。
試してみました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
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 スクリプトが壊れる可能性があります。