在提示符中包装命令

Edd*_* Jr 8 bash prompt zsh

是否可以在提示中的命令后插入分隔符?这是一个例子:

~/Desktop: ls -al
-------------------------------------
total 80
drwx------+  6 eddie  staff   204B Apr 29 16:57 .
drwxr-xr-x+ 54 eddie  staff   1.8K Apr 30 10:54 ..

~/Desktop:
Run Code Online (Sandbox Code Playgroud)

具体我想在发出命令后添加 --------- 部分,以便更容易地区分命令和结果

Lar*_*rsH 9

在 zsh 中,您可以定义钩子函数preexec在每个命令执行之前回显指定的字符串。

在 bash 中,您可以使用DEBUG陷阱来设置 preexec 挂钩来执行相同的操作。

您将定义一个 preexec() 函数,如下所示:

preexec () { echo "-------------------------------"; }
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    preexec
}
trap 'preexec_invoke_exec' DEBUG
Run Code Online (Sandbox Code Playgroud)

看到更多的细节的确有庆典正在执行一个命令之前运行的钩子?

不过,我认为这不适用于所有版本的 bash。在我的旧 Ubuntu 服务器上,运行 bash 3.2.39(1),help trap

如果 SIGNAL_SPEC 是 DEBUG,则每个简单命令之后执行 ARG 。

在另一台运行 bash 4.1.2(1) 的服务器上,它说

如果 SIGNAL_SPEC 是 DEBUG,则每个简单命令之前执行 ARG 。

这就是我们所需要的。因此,请确保在您的 bash 版本中,help trap说“每个简单命令之前”。


Tim*_*edy 5

如果您在 shell 中使用 bash 或 ksh,您可以在您的一个点文件(.profile、.bash_profile 等)中创建一个函数,如下所示:

function hr {
    echo "--------------------------------------------------------------------------------"
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在希望该分隔符使用&&;作为命令分隔符时将其添加到命令中。如:

bash-[534]$ hr && ls
--------------------------------------------------------------------------------
ddtool_23.jnlp  prtconf-pv
Run Code Online (Sandbox Code Playgroud)

或者

bash-[536]$ hr ; ls -la
--------------------------------------------------------------------------------
total 36K
drwxr-xr-x  2 tim staff    4 2012-12-06 15:02 ./
drwxr-xr-x 46 tim staff  134 2013-04-30 14:59 ../
-rw-------  1 tim staff 2.7K 2012-12-06 15:00 ddtool_23.jnlp
-rw-r--r--  1 tim staff  24K 2012-12-06 15:02 prtconf-pv
Run Code Online (Sandbox Code Playgroud)

我这样做。我还有第二个功能可以打印更厚的分隔符。

function hr2 {
    echo "================================================================================"
}
Run Code Online (Sandbox Code Playgroud)

我经常在 shell 脚本中使用这些函数来分隔脚本的不同部分,例如hr2主要任务hr之间以及循环语句中的项目之间。它使阅读脚本输出变得更加容易。

  • 为什么不是`function hr { echo '---...'; "$@"; 代替?然后你也可以不用 `&&` 或 `;` 来使用它:`hr ls -la`。顺便说一下,一个更厚的分隔符:`figlet -- '---...'`。 (2认同)