簡體   English   中英

將 bash shell 中執行的每個命令傳遞給一個變量

[英]Pass every command executed in the bash shell to a variable

我想將在 bash shell 中執行的每個命令傳遞給一個變量,以便用於更改顯示正在運行的應用程序的 label。

由於較新版本的bash具有 preexec 掛鈎、 PS0 (在讀取命令后和執行命令之前展開並顯示)和PROMPT_COMMAND (值被解釋為在打印每個主要提示之前執行的命令),我在想使用這些來實現label的變化。
如下圖PS0PROMPT_COMMAND="printf '\033kBASH\033\\'"這樣輸入的命令執行后label恢復為BASH

因此,例如, top已啟動,

$ top輸入

理想情況下,作為字符串的top將分配給$TO_BE_EXECUTED_APP var,它將用於類似
PS0="print '\033k$TO_BE_EXECUTED_APP\033\\'"

例如, tmux可以使用這些轉義序列來更改其 window label。

我無法實現的是用要執行的命令作為字符串填充$TO_BE_EXECUTED_APP

我嘗試使用$BASH_COMMAND ,沒有積極的結果。

使用這個 shell function 我可以手動實現我需要的:

exelabel() {
        printf "\033k$@\033\\"
        "$@"

$ exelabel top輸入

但我當然希望它自動完成。 有任何想法嗎?

您可以使用它來獲取當前命令:

HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"

這是我用來在 xterm 標題上顯示當前命令的內容:

PS0='$(printf "\e]0;%s\7" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'

在你的情況下,你可以這樣做(評論后更新):

PS0='$(printf "\033k%s\033" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'

要么

PS0='$(printf "\033k%s\033\\\\" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'

@菲利普:

進入

PS0='$(printf "\033k%s\033\\" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'

每次輸入后都會產生這些錯誤

bash: command substitution: line 32: unexpected EOF while looking for matching `"'
bash: command substitution: line 33: syntax error: unexpected end of file
bash: command substitution: line 1: unexpected EOF while looking for matching `"'
bash: command substitution: line 2: syntax error: unexpected end of file

我還將同一行分配給測試變量:

testing='$(printf "\033k%s\033\\" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'

如果我在提示符下鍵入:
$ $testing輸入

我收到此錯誤:

bash: $(printf: command not found

也嘗試去掉printf之后的空格,報錯變為:

bash: $(printf"\033k%s\033\\": command not found

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM