好的,所以我一直认为一个功能应该足够了。没有别名,没有 bashisms,没有废话。但在我看来,在不影响常规使用(例如扩展和完成)的情况下,唯一的方法是将函数放在命令的末尾。这并不像人们最初想象的那么容易。
首先,我考虑了一个附加到末尾的函数,我会调用它,例如,printf "%b" "\u"
为了剪切当前行,插入另一个printf
,将其粘贴回去,并在开头加上一两个引号,然后在结束。我不知道如何使这项工作,但我很抱歉。即使我这样做了,由于shell解释escape
序列的方式不同,我也不希望这种方法有任何真正的可靠性/可移植性,更不用说它们运行的终端仿真器了。也许stty
可以提供沿着这些思路前进的方法,但是如果是这样,你不会在这里找到它......现在,无论如何。
我最终改为将当前命令实际复制/proc/{PID}/cmdline
到一个变量中,然后(可耻地)完全杀死它,最后按照我的喜好包装它。从好的方面来说,这很容易完成,很快就完成了(尽管我可以想象以任何一种方式争论它的“效率”),并且无论原始输入如何,无论是别名、变量还是函数等。我相信它也是 POSIX 可移植的(虽然我不记得是否需要kill SIGNALS
为 POSIX 指定名称),而且绝对不是废话。
另一方面,它的优雅当然还有很多不足之处,虽然它可能不值得担心,但它确实完全浪费了一个PID.
,它并不能完全阻止shell 垃圾邮件;也就是说,在我的 shell 中,我启用了后台jobs
报告,set
因此,当第一次运行时,shell 友好地通知我我刚刚打开并浪费了PID
两行。另外,因为我复制../cmdline
而不是直接与0
文件描述符接口,所以我希望管道;
等会出现问题。我可以而且很可能会很快解决这个问题。
我将解决这个问题,也就是说,如果我无法找到一种方法来代替使用,正如我怀疑可以做到的那样,SIGTSTP
+SIGCONT
首先在子shell 之外暂停进程,然后在重定向子shell 的输出后在一个进程中继续它。由于我尚未发现的原因,这似乎不可靠,但我认为它很有希望。也许nohup
和一个trap
(实际上rehup
是)是需要的,但我也不确定如何将它们放在一起......
Amyway,不用多说,我的半中止,向后的 gui 启动器:
% _G() { (
_gui_cmd="$(tr '\0' ' ' </proc/"$\!"/cmdline )" ;
kill -9 "$\!" ;
exec eval "${_gui_cmd} &" )
&>/dev/null 2&>1
}
% google-chrome-beta --disk-cache-dir="/tmp/cache" --disk-cache-size=100000000 &_G
[1] 2674
[1] + 2674 killed google-chrome-beta --disk-cache-dir="/tmp/cache" --disk-cache-
%
因此,如果尝试进行类似操作,可能会遇到的另一个问题是 shell 假定的扩展顺序。如果没有像我这样的技巧,在前面的命令将它作为参数之前,你肯定会遇到一些严重的困难来扩展你的函数。我相信我已经通过简单地将我的_G
函数调用附加到原始命令的&
背景指令上来防止这种情况发生而没有不必要的冗余。只需添加&_G
到您希望运行的命令的末尾,祝您好运。
-麦克风
PS 好的,所以写最后一句话让我想到可以用tee
.