命令行

2022-08-11  本文已影响0人  bowen_wu

概述

本质

命令的四要素

Environment Variable

Executable

分类

  1. 二进制可执行程序 => 符合对应操作系统的要求,能够直接执行,无需解释器 => file jdk-11.0.13.jdk/Contents/Home/bin/java => jdk-11.0.13.jdk/Contents/Home/bin/java: Mach-O 64-bit executable x86_64
  2. 脚本 => 在第一行指定解释器(shebang) => #!/usr/bin/env xxx(在当前环境变量中查找 xxx 程序) => 等同于 xxx <file>.sh

Arguments

Working Directory

标准输入 & 标准输出 & 标准错误

管道

重定向

tee

Shell 返回值

在 Java 程序中启动和执行命令

JVM Default System Property

Java 程序 fork 一个新进程

import java.io.BufferedReader;
import java.io.InputStream;

public class ForkProcess {
    public static void main(String[] args) {
        // 获取当前项目的 git log 数据
        // executable git
        // arguments log --oneline
        // environment variable
        // working directory
        ProcessBuilder pb = new ProcessBuilder("git", "log", "--oneline");
        // pb.inheritIO().start();
        Process process = pb.start();
        InputStream inputStream = process.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, Charsets.UTF_8));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

        pb.environment().put("AAA", "111");
        ProcessBuilder pb = new ProcessBuilder("ls", "*"); // Error。此时 * 不会进行通配符展开,通配符展开是 bash 的行为
        ProcessBuilder pb = new ProcessBuilder("bash", "-c", "ls *");
        ProcessBuilder pb = new ProcessBuilder("ls", "`pwd`/.."); // Error
        ProcessBuilder pb = new ProcessBuilder("ls", "|", "wc", "-l"); // Error
    }
}

输入输出重定向

知识点

  1. CR/LF => CarriageReturn/LineFeed
  2. OS(操作系统) => 抹平了硬件的差异
  3. POSIX标准
  4. PS1 => terminal 的前缀提示符 Personal-Laptop-14 at ~ ❯ => echo $PS1
  5. bash doc
  6. bash -x <command> => 将命令内部的执行过程打印出来用于排查
上一篇 下一篇

猜你喜欢

热点阅读