可能重复:
ECHO扩大PS1
有没有什么办法来“评价” PS1
, PS2
从bash脚本中,等?
虽然,我可以使用替代手段得到我目前的所有元素PS1
,我真的很希望能够重用,而不是使用这些替代方法的定义。
例如,
=====================================
PS1 element --> Alternate means
=====================================
\u --> $USER
\h --> $HOSTNAME
\w --> $PWD
...
=====================================
我很可能使用“替代方法”列在我的剧本,但我不想。 在我的PS1
,我举个例子,使用经我希望能够简单地通过评估重用其终端转义序列大胆的蓝色PS1
。
开源软件的一个大优势是,源,以及开放:-)
如果你下载的代码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
,它肯定是一个选项。