如何设置在每个提示之前运行的命令?

如何设置在每个提示之前运行的命令?

我曾经知道这一点,但我忘记了:我想在每个提示之前执行一个命令或几个命令。当我在我们的 PROD 框中时,我希望在每个提示上方都有一个大大的提醒,上面写着* 您正在生产中 *也许还有一两件事。目前,我认为这就是检查邮件的方式,但我不记得如何设置该配置。

使用 ksh 和 Solaris 5.10

任何想法?

谢谢

答案1

如果您想要的只是一个大的固定警告,那么只需将其添加到提示中即可:

red=$(tput setaf 1; tput smso; tput bold) reset_color=$(tput sgr0)
PS1='
${red}[THIS IS A PRODUCTION SYSTEM!!]${reset_color}

rest of the prompt$ '

在现代(1995 年之后)ksh(ksh93、mksh)的实现中,$PS1受命令替换和参数扩展的影响,因此您可以执行以下操作:

function mywarning {
  tput setaf 1; tput bold
  date "+it's %T, please remember it's a production system"
  tput sgr0
}

PS1='$(mywarning)# '

在 ksh88 中(Solaris 10/usr/bin/ksh仍然如此),提示符中仅完成参数和波形符扩展。

对于提示中的任何奇特内容,您都必须恢复到聪明的技巧。然后,你能做的事情就非常有限。

虽然不执行算术扩展,但由于您可以扩展诸如 之类的内容${array[expr]},因此您可以expr计算算术表达式(此处为 )。因为赋值(尽管只对数值)可以在算术表达式中完成,所以这提供了一些做奇特事情的机会。

您可以使用它来后处理动态变量,例如$SECONDS, $PWD, $?, $!, $RANDOM, $_

例如,您可以通过以下方式获取 HH:MM:SS 日期:

typeset -Z2 _h _m _s
eval "$(date +'SECONDS=$((%H*3600+%M*60+%S))')"
PS1='${z[(_h=SECONDS/3600)+(_m=(SECONDS/60)%60)+(_s=SECONDS%60)]}${_h}:${_m}:${_s} $ '

您可以添加您的肥胖警告每 5 次提示一次:

set -A warn '' '
[THIS IS A PRODUCTION SYSTEM!!]
' '' '' ''
PS1='${warn[warn_count=(warn_count+1)%5]}# '

我不认为你可以在每个提示之前运行一个命令(邮件检查是由 内部完成的ksh),但是你可以在每个命令之后使用 DEBUG 陷阱运行一个命令:

trap 'my-command' DEBUG

请注意,它是在每个子 shell 中的每个简单命令之后完成的。

例如,在:

for f in *; do :; done

my-command将运行与当前目录中有文件一样多的次数。

在:

: | :

它运行了 3 次...所以实际上,它并不实用。

答案2

我只是将其放入/etc/profile, 或/etc/issue。有时会关闭显示问题文件的内容,但我仍然认为这是一个很好的提醒。

更改变量的内容$PS1是可以的,我想,您可能仍想打印一些警告/etc/profile。由于它是一个生产系统,因此可以编辑这些文件,因为在这里,您希望系统中发生持久的更改。 (通常,我建议不要更改这些文件并改用用户文件。)

答案3

您可以使用以下命令查看主机、时间、位置和 git 分支:

HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

您可以修改其中任何一个,例如host。

如果你想运行命令,请使用 backtics - these``

相关内容