出现提示后运行命令

出现提示后运行命令

我创建了一个调情者脚本仅输出带有随机颜色的随机句子,现在我希望每次输入命令时都运行它

我用于trap "~/flirt.sh" DEBUG.bashrc目的,但有一个小问题:

for i in 1; do
    echo $i
done

运行调情者两次,如果我使用for i in {1..2}输出将是脚本和 1 的 2 次,之后是脚本和 2 的另外 2 次,例如,对于循环中的每个命令,它运行脚本 2 次。我正在寻找一种运行命令(脚本)的方法一度当我按下回车键后我输入的命令开始执行,所以像这样:

# Nothing typed so script won't be executed
$
# Script and command will be executed
$ ls
Hello from flirt.sh!

Documents Downloads
...

# Script will be executed only once
$ for i in {1..2}; do echo $i; done
Hello from flirt.sh!

1
2

请问有什么建议吗?

答案1

您已在评论中澄清,您确实希望该命令仅针对每个提示运行。不能直接获得的bash是,“在我按 Enter 键之后和我键入的命令开始执行之前运行命令 [...] 的方法“。但是,可以使用 来解决此问题trap '…' DEBUG

这里有两个建议给你

  1. PROMPT_COMMAND。此功能立即运行命令每个提示。bash(参见)的文档man bash写道,

    PROMPT_COMMAND如果设置,则该值将在发出每个主提示之前作为命令执行。

    例子

    PROMPT_COMMAND='date'
    PROMPT_COMMAND='printf "Date: %s Id: %s\n" "$(date)" "$(id -un)"'
    PROMPT_COMMAND='echo "Command 1"; echo "Command 2"'
    
  2. trap '…' DEBUG。正如您已经发现的,这将允许您在执行命令之前立即运行该命令。该文档写道trap

    如果 sigspec 为,则命令 arg 在每个简单命令、命令、命令、命令、每个算术命令之前以及 shell 函数中执行的第一个命令之前DEBUG执行forcaseselectfor

    因此,我们在这里可以做的是让陷阱Flirt.sh在每次提示后仅运行一次命令,在第一次提示后使用切换按钮来抑制它,直到收到下一个提示。

    PROMPT_COMMAND='_trace=yes'
    trap '[[ "$_trace" == "yes" ]] && echo Flirt.sh; _trace=no' DEBUG
    

    在这里我用它echo Flirt.sh来代替你的flirt.sh脚本。

    示例会话

    $ date
    Flirt.sh
    28 Jan 2022 16:57:51
    $ for i in 1 2 3; do echo i=$i; done
    Flirt.sh
    i=1
    i=2
    i=3
    $
    
  3. 无命令时不触发

    添加一个简单的检查$BASH_COMMAND可以防止误触发

    trap 'cmd="$BASH_COMMAND"; [[ "$cmd" != "$PROMPT_COMMAND" ]] && echo ~/.Flirt.sh' DEBUG
    

相关内容