我创建了一个调情者脚本仅输出带有随机颜色的随机句子,现在我希望每次输入命令时都运行它
我用于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
。
这里有两个建议给你
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"'
trap '…' DEBUG
。正如您已经发现的,这将允许您在执行命令之前立即运行该命令。该文档写道trap
,如果 sigspec 为,则命令 arg 在每个简单命令、命令、命令、命令、每个算术命令之前以及 shell 函数中执行的第一个命令之前
DEBUG
执行for
case
select
for
因此,我们在这里可以做的是让陷阱
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 $
无命令时不触发
添加一个简单的检查
$BASH_COMMAND
可以防止误触发trap 'cmd="$BASH_COMMAND"; [[ "$cmd" != "$PROMPT_COMMAND" ]] && echo ~/.Flirt.sh' DEBUG