#shell #learning #prompt #color #posix #applications #compliance

app vrsh

一个为了学习而编写的简单shell

3个版本

0.1.2 2023年5月28日
0.1.1 2023年5月28日
0.1.0 2021年5月30日

#9 in #compliance

每月 31次下载

AGPL-3.0

515KB
1.5K SLoC

vrsh

一个用Rust编写的简单shell,作为我学习Rust的方式

长期目标/梦想(可能不会实现),达到POSIX合规性 (https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html)。

可定制提示

要自定义提示,可以设置 PROMPT 变量。这可以通过使用 set var=val 语法来完成,其中 val 是一个字符串,请注意,如果使用单引号 (') 包裹字符串,则字符串内容将被保留,并且将在提示上执行提示扩展,请参阅 提示扩展。如果使用双引号 (") 包裹字符串,则将在字符串上执行标准扩展(注意,这些是在立即评估的,而单引号语法是在每次提示显示时评估的)。

要使提示配置永久化,可以在 ~/.vrshrc 文件中设置 PROMPT 变量(如果不存在,则在应用程序启动时生成)。

提示扩展

目前支持以下提示扩展

  • %% 用于 % 字符。
  • %n 当前用户的用户名。
  • %F{var} 用于设置后续文本的前景色,var 必须是受支持的颜色之一(请参阅 提示扩展颜色);或者是一个范围在0-255之间的数字,请参阅 ansi 8位着色
  • %f 重置前景色。
  • %K{var}%F 工作相同,但用于背景色。
  • %k 重置背景色。
  • %g 根据内置的 git 模块(如下例中所示)打印 git 信息。
  • %d%/ 完整地打印当前工作目录。
  • %~ 打印当前工作目录,但将 /home/current_user 替换为 ~/
  • %~> 只打印带有前导 / 的当前目录(例如,如果当前路径是 /var/log,则将打印 /log)。如果当前工作目录是 /home/current_user,则将打印 ~/
  • %-< 打印当前目录的父目录(例如,如果在 /var/log 中,则将打印 /var)。如果当前目录是根目录 (/),则不会打印任何内容。

提示符颜色扩展

要测试当前终端中的颜色,可以使用 vrsh-colors 命令,该命令将打印所有 256 种支持的亮色和暗色。以下是命名颜色及其数值:

  • 红色 = 1
  • 绿色 = 2
  • 橙色 = 3
  • 蓝色 = 4
  • 紫色 = 5
  • 蓝绿色 = 6
  • 白色 = 7
  • 灰色 = 8
  • 深红色 = 9
  • 亮绿色 = 34
  • 亮蓝色 = 123
  • 粉色 = 200
  • 黄色 = 220

示例

我目前使用的提示符示例如下,虽然它有点冗长。

set PROMPT='%F{blue} %~%f %F{orange} as %f %F{purple}%n%f %g %F{brightgreen} ❯ %f' PROMPT 提供以下提示符:提示符示例

可以使用 %~<%~> 选项来打印完整路径,但仅突出显示当前目录,例如

set PROMPT='%F{31}%~<%f%F{51}%~>%f%F{214} as%f%F{170}%n%f%g%F{46} ❯%f'

提供以下提示符

prompt example 2

来自 vrsh-colors 命令的示例输出

vrsh-colors example

当前和计划中的功能

目前只实现了一小部分功能,但计划增加更多功能,请随时提出要添加到计划功能列表中的功能建议!

当前和计划中的功能列表

  • 执行具有给定参数的程序。
  • 支持单引号 '
  • 没有空格的参数应视为一个参数,例如 "asd""bsd" 应被视为一个参数。
  • 支持环境变量,例如:$HOME
  • 支持注释 #
  • 命令历史
    • 持久化(存储在用户主目录中的历史文件中)。
    • 可以通过使用 上箭头 回到历史和 下箭头 前进历史来重复使用命令。
  • 一些基本的语法高亮
    • 建议之前使用的命令。
    • 高亮(有效)命令。
    • 高亮字符串。
    • 匹配扩展
  • 扩展(更多信息请查看https://gnu.ac.cn/software/bash/manual/html_node/Shell-Expansions.html
    • 使用 $() 的命令扩展。
    • - -> 匹配任何文件。
    • 更多...请参阅上述链接
  • 程序之间的管道 |
  • 重定向
    • 从命令输出到文件(>)。
    • 从文件到程序(<)。
  • 内置命令
    • cd
    • exit
    • alias
      • ~ -> 当前用户的主目录。
    • source
    • 变量,例如:A="some value"
      • 特定于程序的变量,例如:SOME_VARIABLE="some_value" firefox
  • 自动完成
    • 对于历史,请参阅上方。
    • 使用 tab 完成文件。
    • 当有多个选项时,通过按 tab 完成扩展文件。
    • 历史中的命令的 tab 完成功能。
  • 提示符
    • 显示当前路径。
    • Git 集成。
    • 显示当前用户。
    • 显示最后一条命令的结果。
    • 右侧也有提示符。
    • 支持 starship 集成: https://starship.rs/
  • 使用文件进行配置。
    • 能够添加别名。
    • 配置颜色方案。
    • 自定义提示符
  • 后台进程 &
  • 顺序执行的命令 &&

依赖项

~19MB
~411K SLoC