如何在bash中读取最后执行的命令注释(在#之后)?

时间:2018-08-23 04:44:45

标签: bash

我知道执行Bash命令后会分配一些bash变量。其中有些是$?来获取进程的返回值,或者是$BASH_COMMAND来获取实际的调用行,$1$2等来获取调用参数,等等。

一个简单的陷阱陷阱(取自this question)使我可以存储最后执行的命令:

alariva@trinsic:~/test$ trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
alariva@trinsic:~/test$ ls -l #I want to read this comment
total 0
-rw-rw-r-- 1 alariva alariva 0 Aug 23 01:30 readme.md
alariva@trinsic:~/test$ echo $previous_command
ls -l
alariva@trinsic:~/test$ echo $?
0

我需要获取上一条命令后可能出现的注释,但是我不知道会存储它的任何变量。有什么办法阅读吗?

我想得到与此类似的行为:

alariva@trinsic:~/test$ ls -l #I want this comment
readme.md
alariva@trinsic:~/test$ echo $BASH_COMMENT
I want this comment
alariva@trinsic:~/test$ 

当然,当前的情况是我无法从中获取任何信息:

alariva@trinsic:~/test$ echo $BASH_COMMENT

alariva@trinsic:~/test$ 

我还知道,在Bash解释该调用之后,注释可能会被完全删除,因此在这种情况下,我想知道是否存在一种变通方法(如钩子或类似方法)在它真正到达bash之前就可以读取。


到目前为止,这是我实现的目标:

alariva@trinsic:~/test$ ls -l #tosto
total 0
alariva@trinsic:~/test$ LAST=`fc -l | cut -c 6- | tail -n2 | head -n1`
alariva@trinsic:~/test$ echo "${LAST##*\#}"
tosto
alariva@trinsic:~/test$

不确定这是否是最好的解决方案,是否可以在所有情况下使用,但看起来像我想要实现的行为。有任何内置/替代方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:0)

到目前为止,我提出的最接近的解决方案是

alariva@trinsic:~/test$ ls -l #tosto
total 0
alariva@trinsic:~/test$ LAST=`fc -l | cut -c 6- | tail -n2 | head -n1`
alariva@trinsic:~/test$ echo "${LAST##*\#}"
tosto
alariva@trinsic:~/test$

虽然在我使用的大多数情况下都可以使用,但是在发现多个#的某些情况下,它仍然无法获得完整的评论:

alariva@trinsic:~/test$ ls -l #tosto #only partial
total 0
alariva@trinsic:~/test$ LAST=`fc -l | cut -c 6- | tail -n2 | head -n1`
alariva@trinsic:~/test$ echo "${LAST##*\#}"
only partial
alariva@trinsic:~/test$

欢迎对此答案进行改进。