-->

庆典:如何评价PS1,PS2,...? [重复](bash: How to evaluate P

2019-06-23 10:51发布

可能重复:
ECHO扩大PS1

有没有什么办法来“评价” PS1PS2从bash脚本中,等?

虽然,我可以使用替代手段得到我目前的所有元素PS1 ,我真的很希望能够重用,而不是使用这些替代方法的定义。

例如,

=====================================
 PS1 element -->     Alternate means
=====================================
 \u          -->     $USER
 \h          -->     $HOSTNAME
 \w          -->     $PWD
 ...
=====================================

我很可能使用“替代方法”列在我的剧本,但我不想。 在我的PS1 ,我举个例子,使用经我希望能够简单地通过评估重用其终端转义序列大胆的蓝色PS1

Answer 1:

开源软件的一个大优势是,源,以及开放:-)

如果你下载的代码bash (我看4.2版本),有一个y.tab.c包含文件decode_prompt_string()函数:

char *decode_prompt_string (string) char *string; { ... }

您可以尝试提取(与任何需要的支持例程一起并生成可执行该做的工作适合你。虽然,从一个粗略的尝试,这些支持例程似乎是很多,所以这可能是一个艰巨的任务。


除此之外,你或许可以“欺骗” bash与像它扩展到你:

expPS1=$(echo xyzzyplughtwisty | bash -i 2>&1
         | grep xyzzyplughtwisty
         | head -1
         | sed 's/xyzzyplughtwisty//g')

现在,我已经把跨多个行以便于阅读,但它是在一个行来完成。

这样做是运行的一个交互式实例bash ,传递(希望是什么)的命令无效。

因为它是互动的,它打印的提示,所以我抓住与它的命令字符串的第一行,并删除命令字符串。 什么是遗留应该是提示。

在我的系统,这是我所得到的:

pax> expPS1=$(echo xyzzyplughtwisty | bash -i 2>&1 | grep xyzzyplughtwisty | head -1 | sed 's/xyzzyplughtwisty//g')

pax> echo "[$expPS1]"
[pax> ]

pax> 

然而,多行提示,并会真正给你定期提示,而不是当前shell一个这个有问题。


如果你想要做正确,它可能涉及添加一点点地bash本身。 下面是添加一个内部命令的步骤evalps1

首先,改变support/mkversion.sh ,这样你就不会用“真正的”混淆bash ,并使得FSF可以拒绝保修目的:-)只需改变一个线上的所有知识(我加了-pax位) :

echo "#define DISTVERSION \"${float_dist}-pax\""

其次,改变`内建/ Makefile.in添加一个新的源文件。 这需要许多步骤。

(一)添加$(srcdir)/evalps1.def在2002年底DEFSRC

(b)中添加evalps1.o到的末尾OFILES

(c)中添加所需依赖关系:

evalps1.o: evalps1.def $(topdir)/bashtypes.h $(topdir)/config.h \
           $(topdir)/bashintl.h $(topdir)/shell.h common.h

三,添加builtins/evalps1.def文件本身,这是当你运行的是被执行的代码evalps1命令:

This file is evalps1.def, from which is created evalps1.c.
It implements the builtin "evalps1" in Bash.

Copyright (C) 1987-2009 Free Software Foundation, Inc.

This file is part of GNU Bash, the Bourne Again SHell.

Bash is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Bash is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Bash.  If not, see <http://www.gnu.org/licenses/>.

$PRODUCES evalps1.c

$BUILTIN evalps1
$FUNCTION evalps1_builtin
$SHORT_DOC evalps1
Outputs the fully interpreted PS1 prompt.

Outputs the PS1 prompt, fully evaluated, for whatever nefarious purposes
you require.
$END

#include <config.h>
#include "../bashtypes.h"
#include <stdio.h>
#include "../bashintl.h"
#include "../shell.h"
#include "common.h"

int
evalps1_builtin (list)
     WORD_LIST *list;
{
  char *ps1 = get_string_value ("PS1");
  if (ps1 != 0)
  {
    ps1 = decode_prompt_string (ps1);
    if (ps1 != 0)
    {
      printf ("%s", ps1);
    }
  }
  return 0;
}

那大部分是在GPL许可证(因为我修改了它从exit.def有一个非常简单的功能),最后才能获得和解码PS1

最后,只是建立在顶级目录的东西:

./configure
make

bash那似乎可以被重命名为paxsh ,但我怀疑这会不会成为那样普遍作为其祖先:-)

并运行它,你可以看到它在行动:

pax> mv bash paxsh

pax> ./paxsh --version
GNU bash, version 4.2-pax.0(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

pax> ./paxsh

pax> echo $BASH_VERSION
4.2-pax.0(1)-release

pax> echo "[$PS1]"
[pax> ]

pax> echo "[$(evalps1)]"
[pax> ]

pax> PS1="\h: "

paxbox01: echo "[$PS1]"
[\h: ]

paxbox01: echo "[$(evalps1)]"
[paxbox01: ]

现在,理所当然,修改代码来bash添加一个内部命令可以被认为是由一些矫枉过正,但如果你想准确的评价PS1 ,它肯定是一个选项。



文章来源: bash: How to evaluate PS1, PS2, …? [duplicate]