gpt4 book ai didi

shell - 如何在不使用 `!!` 的情况下运行最后一个命令?

转载 作者:行者123 更新时间:2023-12-04 22:30:46 24 4
gpt4 key购买 nike

我正在尝试别名 _!sudo最后一个命令,但我遇到了障碍。 !!在我的 .zshrc 中似乎不起作用文件,而 sed 给了我重复的问题。我尝试使用以下命令及其几种变体,但无济于事。
history | tail -1 | sed -e 's/[^0-9\*\ ]+/\0/g'
但是,这仍然将管道输入解释为文件,而不是文本字符串。我还尝试了使用 awk 的变体:
history | tail -1 | awk '{ gsub("/[^0-9\*\ ]+", "") ; system( "echo" $1 ) }'
我确定我只是在正确输入命令时遇到了一些麻烦,但我们将不胜感激。

最佳答案

您可以使用 fc内置以编程方式访问历史记录。例如,我相信这会如您所愿:

alias _!='fc -e "sed -i -e \"s/^/sudo /\""'

没有参数, fc (“修复命令”的缩写)启动 $EDITOR在您之前的命令上并运行您的编辑结果。您可以使用 -e 指定不同的编辑器选项;在这里,我以 sed 的形式指定了一个非交互式的将插入 sudo 的命令在命令行前面。

该命令假定使用 GNU sed。正如所写,它也适用于现代 BSD/macOS 上的版本,但有一个黑客事件:它处理 -e作为 -i 的参数而不是一个新的选择。自 -e是可选的,只有一个表达式,这很好用,但这意味着 sed使用 -e 备份临时文件最后,它会在命令完成后挂起。您可以通过在这些系统上使用此替代版本来使其更清晰:
alias _!='fc -e "sed -i \"\" -e \"s/^/sudo /\""'

(这不适用于 GNU sed,它将空字符串参数视为要操作的文件名...)

在旧系统上,更便携的解决方案可以使用 ed :
alias _!="fc -e 'ed -s <<<$'\''s/^/sudo /\nw\nq'\'"

你通常可以用更简单的方法逃脱,比如 sudo $(fc -ln -1) ( -l = 列出命令, -n = 没有数字, -1 = 只有最后一个命令),但通常你会遇到引用问题,因为命令是由 fc 输出的它的输入方式:
% touch '/etc/foo bar'
touch: /etc/foo bar: Permission denied
% sudo $(fc -ln -1)
touch: '/etc/foo: No such file or directory

以上都不限于zsh,顺便说一句; fc日期为 ksh 的原始版本,因此它也适用于 bash 等。

关于shell - 如何在不使用 `!!` 的情况下运行最后一个命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27494753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com