用户使用 Ctrl-C 终止命令后我可以运行命令吗?

用户使用 Ctrl-C 终止命令后我可以运行命令吗?

因此,在我的位置,我们使用一组共享的别名来进行构建。就像是...

alias 'build'='cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; cd -'

这非常令人恼火,因为 make 命令大约需要 3 分钟,我通常意识到我错过了一些东西,按下 Ctrl-C,然后立即再次运行构建。这让我处于一个我不喜欢的目录中,并且需要重新输入一个痛苦的路径。

我真正想要的是...

alias 'betterbuild'='pushd .; build; even-if-the-user-cancelled popd'

有没有办法做到这一点?

答案1

好吧,我想说让它成为一个脚本,因为别名并不真正意味着做像这样的复杂事情和脚本适用于更复杂或更长时间运行的任务。别名基本上意味着将一个命令映射到另一个命令,例如为本身不支持该命令的命令提供默认参数。

但是,由于您在评论中表示希望保留此别名,因此我们必须弄清楚如何在别名的范围内执行您想要的操作。

然后自然的选择是从别名内启动子 shell。例如:

~$ alias xyz1='( cd ~/tmp; sleep 10; cd ~ )'
~$ alias xyz2='cd ~/tmp; sleep 10; cd ~'
~$ xyz2
^C
~/tmp$ cd
~$ xyz1
^C
~$

Ctrl这仅更改子 shell 内的工作目录,当别名正常完成执行或通过+中止时,子 shell 退出C

答案2

您也许可以使用子 shell。

alias build='( cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

在上面的示例中,cd $BUILD_ROOT更改了子 shell 的当前工作目录,但不更改调用别名的交互式 shell。对于一般情况,您可以使用子 shell 和退出陷阱。

alias build='( cleanup() { do; cleanup; }; trap cleanup EXIT; cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

不过,请重新考虑使用脚本。上面的例子在脚本中看起来会干净得多。脚本在它们自己的 shell 实例中解释。脚本中不需要子 shell 语法。

您在评论中提到脚本取决于您的别名。这表明您正在获取脚本而不是执行它们,这通常是一种不好的做法。另外,您提到有些别名取决于您的别名。您可以在别名中使用脚本。

相关内容