如何在 Fish Shell 中获取完整的当前命令

问题描述 投票:0回答:2

我想使用

terminal-notifier
构建一个包含当前命令信息的通知,但我找不到获取当前命令的方法,如下标记为
(????)

alias notify=terminal-notifier -message "Done with [(????)]" -title (if test $status = 0; echo "$_ suceeded"; else; echo "$_ exited with error [$status]"; end) -sound default -ignoreDnD

我将其用作

echo 1; notify
并且消息将是
Done with [echo 1;notify]

我尝试过

$_
status current-command
commandline
,但都不包含参数或管道后面的内容。
history | head -n1
在执行之前没有该命令。

fish
2个回答
1
投票

为了确保捕获整个命令行(而不仅仅是命令),我想我会做更多类似的事情:

function notify
    eval "$argv"
    set s $status
    if test $s = 0
        set message Succeeded
    else
        set message "Exited with error [$s]"
    end
    echo "Done with '$argv' - $message"
end

> notify echo 1
Done with 'echo 1' - Succeeded

> notify false
Done with 'false' - Exited with error [1]

# Put multiple commands in quotes, if needed
> notify "echo 1; echo 2"
Done with 'echo 1; echo 2' - Succeeded

为了简单起见,我用基本的

terminal-notifier
替换了您的
echo
,因为我不在 Mac 上。

虽然

commandline
根据手册页/文档看起来很有希望,但它实际上只在按键绑定和/或完成功能中有用。

我猜您已经知道这一点,但如果不知道(或对于其他读者来说),请将

notify
函数放入
~/.config/fish/functions/notify.fish
中以使其持久化(并按需延迟加载)。


0
投票

status current-commandline
似乎可以解决问题。即:

function alert -d "Show an alert after a command"
    set message "terminal alert"
    if [ $status = 0 ]
        set message "$message: OK"
    else
        set message "$message: ERROR ($status)"
    end
    hterm-notify.sh "$message" "$(status current-commandline | string replace -r ";.*" "")"
    tput bel
end
© www.soinside.com 2019 - 2024. All rights reserved.