bash:如何评估 PS1、PS2……? [复制]

2023-11-21

可能的重复:
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 bit):

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

其次,更改“builtins/Makefile.in”以添加新的源文件。这需要执行多个步骤。

(a) Add $(srcdir)/evalps1.def到最后DEFSRC.

(b) Add 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

The 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,这当然是一个选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash:如何评估 PS1、PS2……? [复制] 的相关文章

  • Bash 脚本:自动为 mpeg-dash 进行 ffmpeg 编码

    我正在编写一个 bash 文件来创建视频编码和串联 以供 dash 实时流媒体使用 基本上 它读取输入视频文件夹 将所有视频编码为三种分辨率格式 然后将它们连接起来创建三个适应集 DIAGRAM 该脚本检查 fps 一致性 如果输入不是 1
  • Spyder 无法启动:spyder:找不到命令

    我已经安装了spyderpip3 install spyder在苹果电脑上 但是 当我无法从 bash 启动它时 它会显示spyder command not found 我已按照其说明进行操作Github页面 https github c
  • 带有变量 bash 的降序循环

    cat fromhere sh bin bash FROMHERE 10 for i in seq FROMHERE 1 do echo i done sh fromhere sh 为什么不起作用 我找不到任何在谷歌中搜索降序循环的示例 甚
  • 用等号完成命令选项

    我正在尝试为可能需要表单上的长选项的命令编写一个 Bash 完成脚本 option or param value 如果用户已经在命令行上输入了一个选项 则该选项应从完成列表中排除 假设仅在命令行上指定一次给定选项才有意义 这是第一次尝试 m
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢
  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 每当 SQLERROR 永远不起作用时

    我不知道可能是什么原因 我已经在网上花了几个小时试图找出我的情况出了什么问题 我查过官方文档 https docs oracle com cd B19306 01 server 102 b14357 ch12052 htm还有一些汤姆 凯特
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • Bash 参数引号和 eval

    我编写了一个 bash 日志记录库 用我公司当前正在使用的一些复杂脚本来实现 在进行日志调用时 我一直致力于提供调用脚本的脚本文件名 BASH SOURCE 和行号 LINENO 但是 我不想依赖用户或实现脚本来将这两个变量作为参数传递 如
  • sed/awk/bash 用外部文件内容替换两个字符串之间的文本

    我正在编写一个脚本 命令 它将采用 inputFile1 在其中查找特定的开始和结束字符串 并替换它们之间的所有文本 包含 inputFile2 的完整内容 理想情况下 但不是强制性的 这应该不需要转义特殊字符即可工作 因此我可以将字符串放
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 使用 awk 解析日志文件

    我尝试使用以下代码解析日志文件 if line match then awk 2 vFiler echo vFiler 解释 有一些行以这样的模式开头 或 vol 后跟名称 我想找到所有以 或 vol 并将后面的字符串设置为等于变量 但我真
  • shell中如何求数组的长度?

    shell中如何求数组的长度 例如 arr 1 2 3 4 5 我想得到它的长度 在本例中是 5 a 1 2 3 4 echo a 4
  • 在 BASH 脚本中使用字符串作为变量名

    我有以下内容 bin sh n fred bob f n echo f 我需要在替换后执行底线 echo n 有办法做到这一点吗 我刚刚得到 test sh line 8 f bad substitution 在我这边 您可以像这样使用数组
  • 为什么是 ”& ;”无效的语法?

    我正在尝试在终端上运行 for 循环 我希望将每次迭代发送到后台进程 以便所有迭代同时运行 以下是命令一一运行 for i in sra do fastq dump split files i done only 我突出显示了分号 要同时运
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • 如何重命名 bash 函数?

    我正在围绕另一个定义 bash 函数的软件包开发一些方便的包装器 我想用我自己的同名函数替换他们的 bash 函数 同时仍然能够从我的函数中运行他们的函数 换句话说 我需要重命名它们的函数 或者为其创建某种持久别名 当我创建同名函数时 该别
  • 使用 grep 查找所有匹配的模式

    In txt1 S01A1P2 S01A1P5 S01A1P4 In txt2 data train wave S01A1P3 mfc data train wave S01A1P7 mfc data train wave S01A1P8
  • Bash:产生当父脚本退出时退出的子进程

    我想在 Bash 中生成多个子进程 但我希望父脚本保持运行 这样发送到父脚本的信号也会影响生成的子进程 这不会这样做 parent bash usr bin bash spawnedChildProcess1 spawnedChildPro

随机推荐

  • 在Xcode 6中,如何使用硬件键盘但在iOS模拟器中显示软件键盘

    在 Xcode 6 中 iOS 模拟器似乎要么不显示键盘 这意味着您可以键入但看不到软件键盘的位置和效果 要么显示软件键盘 这意味着您可以在屏幕上看到它 但不能不要在上面打字 用鼠标在软键盘上打字真的很慢 如何恢复旧的行为 即您可以看到软件
  • 是否可以将尺寸设置为独立于地图缩放级别的 groundOverlay?

    我有一个GroundOverlay on my GoogleMap我希望当我放大 缩小地图时它的尺寸不会改变 与默认地图完全相同markers始终保持其尺寸 我尝试过两种形式GroundOverlay setDimensions 但图像仍然
  • django-auth-ldap 安装不起作用

    我试图在我的 Windows 系统中安装 django auth ldap 它显示以下错误 pip build 3x6rkxb4 pyldap modules errors h 8 致命错误 C1083 无法打开包含文件 lber h 没有
  • python - 如何使用popen管道输出?

    我想要pipe我的文件的输出使用popen 我怎样才能做到这一点 test py while True print hello a py import os os popen python test py 我想使用管道输出os popen
  • 为什么在主机上执行“ps aux”时可以看到 docker 容器进程?

    来自主持人 ps aux grep java me my host elastic search group ps aux grep java smmsp 20473 106 6 3 4664740 257368 Ssl 17 48 0 0
  • 缓存 AJAX 请求

    我正在向 PHP 应用程序发送 AJAX GET 请求 并希望缓存请求返回以供以后使用 由于我使用 GET 这应该是可能的 因为不同的请求请求不同的 URL 例如 getHTML php page 2 和 getHTML php page
  • numpy 中唯一元素的分组索引

    我有许多大型 gt 100 000 000 整数列表 其中包含许多重复项 我想获取每个元素出现的索引 目前我正在做这样的事情 import numpy as np from collections import defaultdict a
  • iFrame onload JavaScript 事件

    我有一个 iFrame 我想在加载后向其中发送 JavaScript 命令 我当前的代码如下所示 但使用此代码时 命令不会执行 我必须改变什么才能让它发挥作用 仅需要支持 Chrome 和 Firefox 使用 iFrame 的 onloa
  • 为什么 MQTT 无法与 NodeJS 连接?

    我在尝试连接时遇到一个奇怪的问题MQTT服务器与NODEJS 如果我连接到MQTT服务器和我没有连接它只是挂起 如果我使用命令行执行此操作 我会看到数据 因此网络 服务器等都很好 如果我使用错误的端口 那么命令行会给我一条有效的拒绝消息 但
  • 为什么 django-lint 告诉我 `auto_now_add` 已被弃用?

    各位 Djangonauts 朋友们大家好 我检查了我的项目Django lint 它产生 W 211 16 MyModel timestamp Uses superceded auto now or auto now add The 提交
  • 使用 Oracle PL/SQL Developer 生成测试数据

    我想测试一些模式和索引 并且想知道 PL SQL Developer 中是否有可以生成测试数据的功能 这样我就不必创建序列和循环来在表中插入数据 循环和 PL SQL 并不总是必要的 这个技巧可能会有所帮助 insert into emp
  • Discord window.localStorage 未定义。如何访问 Discord 页面上的 localStorage?

    当我跑步时window localStorage on https stackoverflow com它返回localStorage但是当我在 Discord 页面上使用相同的命令时它会返回undefined每次 Discord 是否正在采
  • Phonegap Cordova - 全屏后底部黑色状态栏

    从我记事起我就一直遇到这个问题 我认为这可能只是来自我的手机或仿真 但在发布我的应用程序后 我仍然在屏幕底部看到这个黑色矩形 它看起来像状态栏 在我的 config xml 中有此内容后会发生这种情况
  • 有没有更简单快速的方法来检测(Windows Phone 7)设备是否有互联网连接

    是否有更简单快速的方法来检测 Windows Phone 7 设备是否有互联网连接 我当前正在发送网络请求 等待超时时间并处理异常 希望有一种快速简单的方法来查询设备 在发送任何请求之前查看它是否有连接 提前致谢 如果没有连接 此方法将返回
  • PHP 获取图像高度和宽度

    您好 我需要动态获取上传图像的高度和宽度 这是我正在使用的 PHP 函数 但它不会返回任何宽度和高度 请你帮助我好吗 list width height type attr getimagesize FILES Artwork min wi
  • 实体框架+存储库+单元或工作问题

    我正在考虑使用 EF 4 启动一个新项目并浏览一些文章 我发现了一篇关于 EF 以及存储库模式和工作单元的文章 http blogs msdn com b adonet archive 2009 06 16 using repository
  • 为什么“uniq”将相同的单词视为不同的单词?

    我想计算文件中单词的频率 其中单词是一行一行的 该文件非常大 因此这可能是问题所在 在本例中共有 300k 行 我执行这个命令 cat temp occ uniq c sort k1 1nr k2 gt distribution txt 问
  • Symfony 2:控制器的依赖注入(DI)

    是否有机会使控制器依赖于其服务 而不是通过使用其中的服务容器 而是通过纯粹的构造函数依赖注入 我想用这种方式编写控制器
  • Python lambda函数计算数字的阶乘

    我刚刚开始学习Python 我遇到了 lambda 函数 在其中一个问题上 作者要求编写一个用于数字阶乘的单线性 lambda 函数 这是给出的解决方案 num 5 print lambda b lambda a b a a b lambd
  • bash:如何评估 PS1、PS2……? [复制]

    这个问题在这里已经有答案了 可能的重复 Echo 扩展 PS1 有什么办法可以 评估 吗 PS1 PS2等来自 bash 脚本中的内容 虽然 我可以使用替代方法来获取当前的所有元素PS1 我真的希望能够重用它的定义 而不是使用这些替代方法