1

我正在寻找的是替代您可能通过在各种平铺 WM 中按 Mod+R 或在 Gnome DE 中按 Alt+F2 的所有这些东西的替代品——一个从那里运行东西的小窗口。没有丢失我的 bash 别名和其他东西,我感到非常难过,因为这些 shell(至少我现在可以使用的那些)是非交互式的,并且它们的交互性不能在运行时设置为选项。

这就是为什么我决定使用 URxvt 窗口作为“一个命令的外壳”。在我的 WM 中,我绑定了 Mod+R 快捷方式来执行

/bin/bash -c 'export ONE_COMMAND_SHELL=t && urxvt -name one_command_shell' 

并放

[ -v ONE_COMMAND_SHELL ] && bind -x '"\C-m":"exit"'

在我的 ~/.bashrc

这样我可以区分一个 URxvt 实例,它将成为“一个命令的 shell”,并设置 Cm 组合(是的,它也适用于 Enter)以退出 shell,因此,URxvt。问题是如何在退出之前执行到目前为止输入的字符串?

我发现了两个潜在的线索:

a) 使用 BASH_COMMAND

BASH_COMMAND
     The command currently being executed or about to be executed,  unless  the
     shell  is executing a command as the result of a trap, in which case it is
     the command executing at the time of the trap.

但我没有让它工作,因为

[ -v ONE_COMMAND_SHELL ] && bind -x '"\C-m":"exec $BASH_COMMAND exit"'

会导致execexec exec

b) SIGCHLD 上的陷阱!

如果您放置,它可能对您有用

[ -v ONE_COMMAND_SHELL ] && {
    PS1=
    eaoc() { exit; }
    trap eaoc SIGCHLD
}

在 ~/.bashrc 的末尾。PS1 可能是非空的,但它可能没有子shell 调用,或者在生成提示之前陷阱将执行并且shell 将退出。这使 URxvt 保持打开状态,直到分叉的进程退出,因此可能被认为是解决方案的中途。

c) DEBUG 的陷阱。

DEBUG 陷阱任何要执行的简单命令之前和每个函数中的第一个命令之前执行。如果我们通过 OC_SHELL 提供一个数字,并且会统计执行的命令的数量,比如……</p>

/bin/bash -c 'export OC_SHELL=0 && urxvt -name one_command_shell' 
# note a zero ----------------^

在 ~/.bashrc 的末尾

[ -v OC_SHELL ] && {
    export PS1=
    eaoc() { echo $OC_SHELL && [ $(( OC_SHELL++ )) -ge 1 ] && wait $! && exit; }
    trap eaoc DEBUG
}

我们又失败了。因为我们的流程,fork like

$ gimp &

与父母一起死去。如何处理?

有趣的是,DEBUG 陷阱在命令输入立即执行,此陷阱不会等待进程返回其状态码或后台进程的 pid,以防使用&.

好的,这就是如何创建独立于 bash 的进程需要以某种方式将输入的字符串包装到(nohup … &)

4

1 回答 1

1

这对我有用:

one_command_execute() {
    eval $(echo "$READLINE_LINE") &
    exit
}

[ -v ONE_COMMAND_SHELL ] && bind -x '"\C-m":"one_command_execute"'

另一个版本没有eval

one_command_checkexit() {
    [ -v ONE_COMMAND_DONE ] && exit
    ONE_COMMAND_DONE=1
}

[ -v ONE_COMMAND_SHELL ] && PROMPT_COMMAND=one_command_checkexit

在命令退出之前,这不会关闭窗口。要在后台自动执行所有内容,请添加:

[ -v ONE_COMMAND_SHELL ] && bind '"\C-m":" & \n"'
于 2013-03-23T19:19:39.203 回答