ksh 陷阱中的多个动作

Multiple actions in trap in ksh

sudo su -之后,我想在k-shell历史列表中同时拥有用户名和时间戳。我有命令行:

trap 'who am i|cut -d" " -f1 |tr "\n" " " && date|read -s' debug

使用此命令,我希望得到如下结果:

UserName Tue Oct 13 15:37:06 CDT 2015 在历史列表中。但是它只显示 Tue Oct 13 15:37:06 CDT 2015

这似乎只执行第二个操作 date,并忽略或覆盖第一个操作。

如何在历史列表中获得用户名和时间戳?

注意到之所以需要用户名是因为多个用户对同一服务用户具有相同的模拟权限

这对我有用:

$ trap 'echo this; echo that' INT
$ sleep 10
^Cthis
that
$ 

如果您需要复杂的命令,通常的方法是使用 ksh -c 'compound | pipe | command',但使用引号会变得非常棘手。

(至少在bash中,子shell可以调用父shell的函数,所以你可以按照评论者的建议定义一个函数。未测试这与 ksh).

更新

这对我有用:

trap 'echo $(whoami|cut -d" " -f1 |tr "\n" " " && date)' INT

考虑做

trap 'echo "$(id -un) $(date)"' INT

甚至

trap 'date "+$(id -un) %DT%T"' INT

等等

我找到了一个简单的解决方案:

  1. 服务用户的主目录下创建文件trapme一行:

    我是谁 | cut -d" " -f1 |tr "\n" " " && 日期

  2. 在.profile中添加一行:

    陷阱'~/trapme |读取-s' debug

这将在包含真实用户登录名和时间戳的命令后创建一行。

将您要将其输出传递给 read 的所有命令放入一个组中:

trap '{ who am i|cut -d" " -f1 |tr "\n" " "; date; }|read -s' DEBUG