【Rust】使用Rust实现一个简单的shell

一、Rust

Rust是一门系统编程语言,由Mozilla开发并开源,专注于安全、速度和并发性。它的主要目标是解决传统系统编程语言(如C和C++)中常见的内存安全和并发问题,同时保持高性能和底层控制能力。

Rust的特点包括:

  1. 内存安全:Rust通过其强大的所有权系统来确保内存安全,避免了空指针引用、悬挂指针和数据竞争等常见问题。编译器在编译时检查所有权规则,确保内存的正确管理,从而避免了运行时错误。

  2. 零成本抽象:Rust的设计哲学之一是提供零成本抽象,即高级特性(如泛型、闭包和模式匹配)在运行时不会引入额外的性能开销。这使得Rust能够在保持高级语言特性的同时,达到与C和C++相当的性能水平。

  3. 并发性:Rust内置了对并发编程的支持,通过其独特的所有权系统和借用检查器来防止数据竞争和其他并发问题。Rust的并发模型基于消息传递和锁,同时提供了异步编程的原生支持。

  4. 函数式编程元素:Rust融合了函数式编程的元素,如不可变性、纯函数、高阶函数和闭包。这些特性有助于编写更简洁、更可维护的代码,并减少状态管理和副作用带来的复杂性。

  5. 静态类型系统:Rust具有强大的静态类型系统,可以在编译时捕获许多类型错误。类型推断功能使得代码更简洁,同时保持了类型安全。

  6. 工具链和生态系统:Rust拥有一个完善的工具链和生态系统,包括包管理器Cargo、文档生成器rustdoc、构建工具rustc等。此外,Rust社区活跃,拥有大量的第三方库和框架,支持各种应用场景。

Rust适用于多种场景,包括系统级编程、网络服务、嵌入式开发、游戏开发等。由于其高性能和内存安全特性,Rust也被越来越多的公司采用,用于构建高性能、可靠的软件系统。

二、安装Rust和Hello World程序

安装Rust

使用官方安装脚本(推荐)安装。Rust 提供了一个方便的安装脚本,可以通过以下命令在 Unix-like 系统中使用:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

这将下载一个脚本,并在本地执行,以安装 Rust 工具链。运行此脚本时,它会询问几个问题并安装 rustup,这是 Rust 版本管理器和安装工具。通过 rustup 将可以安装 Rust 编译器 rustc、Rust 包管理工具 cargo 和标准库。

安装完成后,可以通过运行以下命令来确保 Rust 安装成功:

rustc --version

这将输出已安装 Rust 编译器的版本信息。

为了升级现有的 Rust 版本,可以使用以下命令:

rustup update

Hello World程序

  • 创建一个新的Rust项目:cargo new hello_world

  • src/main.rs文件中编写Hello World程序:

fn main() {  
    println!("Hello, World!");  
}
  • 运行程序:在项目根目录下运行cargo run

三、一个简单的shell

制作一个简单的shell是一项很好的学习项目,尤其是当涉及到Unix系统编程和Rust的系统级能力时。以下是一个使用Rust实现的简单shell的基础框架。

这仅仅是起始点。一个完整的shell会涉及更多复杂的特性和错误处理。

首先,创建一个新的Rust项目:cargo new rust_shell。

Cargo.toml文件:

[package]
name = "rust_shell"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

接着,在main.rs文件中,编写以下代码:

use std::io::{self, Write};
use std::process::{Command, Stdio};

fn main() {
    // 打印欢迎信息
    println!("Welcome to MyShell");
    // 进入REPL(Read-Evaluate-Print-Loop)循环
    loop {
        // 打印提示符
        print!("> ");
        io::stdout().flush().unwrap(); // 确保立即输出提示符

        // 获取用户输入
        let mut input = String::new();
        match io::stdin().read_line(&mut input) {
            Ok(_) => {
                // 移除字符串末端的换行符
                let input = input.trim_end();

                // 如果用户输入"exit",退出程序
                if input == "exit" {
                    break;
                }

                // 解析命令和参数
                let parts: Vec<&str> = input.split_whitespace().collect();
                if parts.is_empty() {
                    continue;
                }

                let command = parts[0];
                let args = &parts[1..];

                // 执行命令
                execute_command(command, args);
            }
            Err(error) => {
                eprintln!("Error reading input: {}", error);
            }
        }
    }
}

fn execute_command(command: &str, args: &[&str]) {
    match Command::new(command)
        .args(args)
        .stdin(Stdio::inherit())
        .stdout(Stdio::inherit())
        .stderr(Stdio::inherit())
        .spawn() {
            Ok(mut child) => {
                // 等待命令执行完成
                match child.wait() {
                    Ok(status) => {
                        println!("Process exited with status: {:?}", status);
                    }
                    Err(e) => {
                        eprintln!("Failed to wait on child: {}", e);
                    }
                }
            }
            Err(e) => {
                eprintln!("Failed to execute command: {}", e);
            }
        }
}

在这段代码中,我们创建了一个基本的REPL循环,用户可以输入命令,然后我们解析这些命令并用`std::process::Command`去执行。每个命令在它自己的子进程中执行,而shell等待直到子进程结束。

要运行这个rust_shell,只需构建并运行项目。如果使用Cargo(Rust的构建系统和包管理器),在项目目录下运行以下命令:

cargo run

然后将能在自制shell中键入命令,比如`ls`或`echo Hello, world!`。

这个shell是非常简单的,没有实现像管道、重定向、变量扩展或是流程控制等shell的高级特性。在创建一个能和成熟shell(如bash或zsh)竞争的程序方面还有很长的路要走,但这个基本版本足够用于理解如何在Rust中开始这类型的项目。如果打算扩展这个基本shell,可能需要研究诸如异步IO、信号处理、作业控制等更复杂的概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/383579.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++构造和折构函数详解,超详细!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家龙年好呀&#xff0c;今天我们来学习一下C构造函数和折构函数。 文章目录 1.构造函数 1.1构造函数的概念 1.2构造函数的思想 1.3构造函数的特点 1.4构造函数的作用 1.5构造函数的操作 1.6构造函数…

洗地机哪个品牌最耐用质量好?耐用的洗地机型号

相较于传统的打扫方式&#xff0c;洗地机的出现可以称得上是懒人福音。一台洗地机就能包办吸、扫、拖所有清洁步骤&#xff0c;节省了大量的打扫时间。不过最近几年洗地机行业涌入的品牌属实有些鱼龙混杂了&#xff0c;至于型号就更是乱七八糟&#xff0c;稍不留神就会白白花了…

深度学习之线性模型

深度学习之线性模型 y w * x模型思路 y w * x b模型思路 y w * x模型 思路 这里求权重w , 求最适合的权重&#xff0c;就是求损失值最小的时候 这里用穷举法:在一个范围内&#xff0c;列出w的所有值&#xff0c;并且计算出每组数据的平均损失值,以w 为横坐标, 损失值为纵坐…

【射影几何15】python双曲几何工具geometry_tools

目录 一、说明二、​环境问题&#xff1a;如何安装三、实现一个简单的例子四、绘制双曲组五、使用有限状态自动机加快速度六、资源和代码 一、说明 Geometry_tools 是一个 Python 包&#xff0c;旨在帮助您处理和可视化双曲空间和射影空间上的群动作。 该包主要构建在 numpy、…

C语言求解猴子分桃子

问题&#xff1a;海滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子平均分为五份&#xff0c;多了一个&#xff0c;这只 猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了 一个&#xff0c;它同样把多的…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Divider组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Divider组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Divider组件 提供分隔器组件&#xff0c;分隔不同内容块/内容元素。 子组件 …

2024年湖南省考报名时间及流程,选岗很重要!

注册时间&#xff1a;2024年2月18日9:00-25日17:00 报名时间&#xff1a;2024年2月19日9:00-25日17:00 网上确认时间&#xff1a;2024年2月28日9:00-3月2日24:00 缴费时间&#xff1a;2024年2月28日9:00-3月2日24:00 打印准考证时间&#xff1a;2024年3月11日9:00-15日17:00 考…

漂亮不是工业HMI的追求?我劝你,这个想法要变了

对于工业HMI&#xff08;Human Machine Interface&#xff09;来说&#xff0c;漂亮并不是唯一的追求&#xff0c;但它仍然是一个重要的方面。在工业环境中&#xff0c;HMI的设计需要考虑到使用者的工作效率和安全性&#xff0c;因此功能性和易用性是首要考虑的因素。然而&…

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

【计算机网络】网络基础入门

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 局域网和广域网2. 协议2.1 认识协议2.2 协议分层 3. OSI七层模型和TCP五层&#x…

Ainx-V0.2-简单的连接封装与业务绑定

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

vue中watch和computed的不同

第076个 查看专栏目录: VUE ------ element UI Vue.js 中的 watch 和 computed 都是用于监听数据变化并执行相应操作的选项&#xff0c;但它们的使用场景和优劣势有所不同。 两者区别 watch 用于监听一个或多个数据属性的变化&#xff0c;并在变化时执行相应的处理函数。 它…

Windows快捷键大全(包含语音输入、剪切板历史快捷键)

最近发现了微软官网上给出的快捷键大全&#xff0c;并且使用了其中几个新的键盘快捷键&#xff08;语音输入、剪切板历史&#xff09;&#xff0c;确实方便快捷&#xff0c;所以写个博客记录分享一下。 注&#xff1a;windows快捷键大全微软官方已经给出&#xff0c;此处不再赘…

中创ET4410 台式LCR数字电桥 简单开箱测评

最近买了一台LCR电桥&#xff0c;完善一下自己实验室的设备&#xff0c;选了中创ET4410&#xff0c;这款性价比高一点。 1199元在PDD买的&#xff0c;好像胜利的VC4090C也是找中创代工的。 ET4410介绍 本系列LCR数字电桥是采用自动平衡电桥原理设计的元件参数分析仪&#xf…

数据库恢复

文章目录 前言一、事务1.概念2.定义语句3.ACID特性 二、数据库恢复的必要性1.为什么要进行数据库恢复2.数据库恢复机制的作用 三、数据恢复使用的技术1.数据转储2.登记日志文件 四 、不同故障的数据恢复策略1.事务内部的故障2.系统故障3.介质故障 五、具有检查点的恢复技术1.检…

JVM学习记录

JVM基础概念 JVM是一个运行在计算机上的程序&#xff0c;负责编译java字节码文件&#xff0c;支持跨平台特性。 java语言为了通过实时解释实现多平台支持&#xff0c;性能相对于C等语言较低&#xff0c;而JVM提供了JIT即时编译进行性能优化。 JVM与JIT JVM负责解释和执行Ja…

13 年后,我如何用 Go 编写 HTTP 服务(译)

原文&#xff1a;Mat Ryer - 2024.02.09 大约六年前&#xff0c;我写了一篇博客文章&#xff0c;概述了我是如何用 Go 编写 HTTP 服务的&#xff0c;现在我再次告诉你&#xff0c;我是如何写 HTTP 服务的。 那篇原始的文章引发了一些热烈的讨论&#xff0c;这些讨论影响了我今…

go安装与设置

开发环境 安装 下载地址 https://golang.org/dl/(国外的可能不能访问) https://studygolang.com/dl(国内网址,推荐) 安装 下载完成后点击运行,一直next,就可以,安装成功后打开winR输入cmd打开命令行输入go env, 输出 证明安装成功 改变$GOPATH $GOPATH是go存储第三方包和编…

《UE5_C++多人TPS完整教程》学习笔记4 ——《P5 局域网连接(LAN Connection)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P5 局域网连接&#xff08;LAN Connection&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

精品springboot善筹网(众筹)互助前后台购物商城实现设计

《[含文档PPT源码等]精品基于springboot善筹网(众筹)前后台实现设计[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xf…