shell命令扩展

文章目录

  • 前言
  • 一、逻辑运算符
    • [1.1 逻辑运算符 &&](#1.1 逻辑运算符 &&)
    • [1.2 逻辑运算符 ||](#1.2 逻辑运算符 ||)
    • [1.3 组合注意](#1.3 组合注意)
  • 二、echo
    • [2.1 标准输出(stdout)](#2.1 标准输出(stdout))
    • [2.2 输出到标准错误(stderr)](#2.2 输出到标准错误(stderr))
  • 三、标准文件描述符(FD)
    • [3.1 描述符说明](#3.1 描述符说明)
    • [3.2 示例演示](#3.2 示例演示)
        • [3.2.1 stdout/stderr](#3.2.1 stdout/stderr)
        • [3.2.2 只把 stdout 重定向到文件,但 stderr 不重定向](#3.2.2 只把 stdout 重定向到文件,但 stderr 不重定向)
  • [四、重定向:>(覆盖)与 >>(追加)](#四、重定向:>(覆盖)与 >>(追加))
    • [4.1 覆盖重定向(>)](#4.1 覆盖重定向(>))
    • [4.2 追加重定向(>>)](#4.2 追加重定向(>>))
    • [4.3 重定向错误输出:2> / 2>>](#4.3 重定向错误输出:2> / 2>>)
  • [五、同时重定向 stdout 与 stderr](#五、同时重定向 stdout 与 stderr)
    • [5.1 POSIX推荐写法](#5.1 POSIX推荐写法)
    • [5.2 Bash 特殊简写(bash/ksh/zsh)](#5.2 Bash 特殊简写(bash/ksh/zsh))
  • [六、输出丢弃 /dev/null](#六、输出丢弃 /dev/null)
    • [6.1 丢弃(stderr)](#6.1 丢弃(stderr))
    • [6.2 同时丢弃两者](#6.2 同时丢弃两者)
  • [七:管道 |(顺便说明,与重定向的区别)](#七:管道 |(顺便说明,与重定向的区别))
    • [7.1 基本用法](#7.1 基本用法)
    • [7.2 stderr 通过管道传给下一个命令](#7.2 stderr 通过管道传给下一个命令)
  • 八、高级技巧:自定义文件描述符
  • 九、小结
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、逻辑运算符

1.1 逻辑运算符 &&

含义::仅当左侧命令成功(退出状态码为 0)时才执行右侧命令。

示例:

bash 复制代码
 false && echo "成功"
 # 没有输出,因为'false'失败(退出码非'0'),所以右侧不执行

true && echo "成功"
# true 成功(退出码为'0'),所以执行echo

1.2 逻辑运算符 ||

**含义:**仅当左侧命令失败(退出状态码非 0)时才执行右侧命令。

示例:

bash 复制代码
false || echo "左侧失败,执行此处"
左侧失败,执行此处```

true || echo "不会执行"
# 没有输出,因为 true 成功,右侧不执行

1.3 组合注意

说明:

A && B || C 从左到右结合,等价于 (A && B) || C 。
示例:

bash 复制代码
$ false && echo yes || echo fallback
fallback
# (false && echo yes) 不成立,于是执行 || 后面的 echo fallback

二、echo

2.1 标准输出(stdout)

含义:

把文本写到 标准输出(stdout)(文件描述符 1)
示例:

bash 复制代码
$ echo "hello world"
hello word

2.2 输出到标准错误(stderr)

含义:

把文本写到 标准错误(stderr,文件描述符 2)
示例:

bash 复制代码
echo "this is error" >&2
这会把文本发送到 stderr

三、标准文件描述符(FD)

3.1 描述符说明

  • 0 = stdin(标准输入)
  • 1 = stdout(标准输出)
  • 2 = stderr(标准错误)

3.2 示例演示

3.2.1 stdout/stderr
bash 复制代码
echo "out"
out # 到 stdout
echo "err" >&2
err # 到 stderr
3.2.2 只把 stdout 重定向到文件,但 stderr 不重定向
bash 复制代码
ls /no/such/path >out.txt
# 终端会显示错误信息(stderr),out.txt 为空或不存在

四、重定向:>(覆盖)与 >>(追加)

4.1 覆盖重定向(>)

含义:

'>'把 stdout 写到文件(覆盖原内容)

bash 复制代码
echo "first" > file.txt
echo "second" > file.txt
cat file.txt
second

4.2 追加重定向(>>)

含义:

">>"把 stdout 追加到文件末尾

bash 复制代码
echo "first" > file.txt
$ echo "second" >> file.txt
$ cat file.txt
first
second

4.3 重定向错误输出:2> / 2>>

含义:

将stedrr(文件描述符2)重定向到文件,支持覆盖或追加
示例:

bash 复制代码
ls /no/such/path 2>err.txt
cat err.txt
ls: cannot access '/no/such/path': No such file or directory


追加示例:

bash 复制代码
ls /no/such/path 2>>err.txt
# 新的错误会追加到 err.txt 后面

五、同时重定向 stdout 与 stderr

5.1 POSIX推荐写法

bash 复制代码
格式:command >out.txt 2>&1

含义:

先把 stdout 重定向到 out.txt ,再把 stderr(2)重定向到当前 stdout(1)指向的位置(也就

是 out.txt )。结果:stdout 和 stderr 都写入 out.txt 。
示例:

bash 复制代码
bash -c 'echo out; echo err >&2' >both.txt 2>&1
cat both.txt
out
err


注意顺序(很重要)

bash 复制代码
与上面不同!
bash -c 'echo out; echo err >&2' 2>&1 >both.txt

这条会把 stderr 重定向到 最初的 stdout(终端),然后再把 stdout 重定向到文件,结果是:错误仍

打印到终端,而文件里只有 stdout 内容。

5.2 Bash 特殊简写(bash/ksh/zsh)

格式:

bash 复制代码
command &>file # 将 stdout 和 stderr 都写入 file(Bash 特性)
command |& other # 将 stdout+stderr 都送入管道(bash/zsh 的简写)

示例:

六、输出丢弃 /dev/null

含义:

把不想要的输出重定向到 /dev/null (黑洞)。

示例:

bash 复制代码
只保留 stderr,丢弃 stdout:
some_command > /dev/null

6.1 丢弃(stderr)

示例:

bash 复制代码
some_command 2> /dev/null

丢弃strerr,保留strout

6.2 同时丢弃两者

bash 复制代码
some_command > /dev/null 2>&1
# 或(bash):
some_command &> /dev/null

七:管道 |(顺便说明,与重定向的区别)

含义:

把前一个命令的 stdout 作为下一个命令的 stdin。默认只传输 stdout,不包含 stderr(除非你把

stderr 重定向到 stdout)。

7.1 基本用法

含义:

把前一个命令的 stdout 作为下一个命令的 stdin。

示例:

bash 复制代码
echo -e "apple\nbanana" | grep banana
banana

7.2 stderr 通过管道传给下一个命令

示例:

bash 复制代码
command 2>&1 | grep something
# 或(bash):
command |& grep something

把 stdout 和 stderr 都传给后面

bash 复制代码
bash -c 'echo out; echo err >&2' 2>&1 | sed -n 'p'
out
err

八、高级技巧:自定义文件描述符

含义:

你可以用 exec 打开一个新的 FD,然后向它写
示例:

bash 复制代码
exec 3>mylog.txt #将文件描述符 3 重定向到文件mylog.txt
echo "hello" >&3  #将 hello 写入到文件描述符 3 关联的文件:mylog.txt
exec 3>& #释放文件描述符 3 的资源,确保文件被正确关闭
cat mylog.txt
hello

进阶技巧常用于脚本中对多个日志流进行管理

九、小结

重定向和管道操作符总结

符号/语法 描述
&& 左命令成功才执行右命令
`
> 覆盖写入 stdout
>> 追加写入 stdout
2> 覆盖写入 stderr
2>> 追加写入 stderr
2>&1 将 stderr 重定向到 stdout
/dev/null 丢弃输出
&> 同时重定向 stdout 和 stderr(bash)
` `
`2>&1 `
` &`

总结

作者很懒,没写总结

相关推荐
偶像你挑的噻11 分钟前
linux应用开发-嵌入编程基础
linux
偶像你挑的噻14 分钟前
linux应用开发-环境构建
linux
key_Go1 小时前
05.《ARP协议基础知识探秘》
运维·服务器·网络·华为·arp
~黄夫人~2 小时前
Nginx Ubuntu vs CentOS 常用命令对照表---详解笔记
运维·笔记·学习·nginx·ubuntu·centos
山川而川-R2 小时前
SSH传输文件-本地远程控制orangepi-上传、下载
运维·ssh
好名字更能让你们记住我2 小时前
Linux网络基础1(一)之计算机网络背景
linux·服务器·网络·windows·计算机网络·算法·centos
laoma-cloud2 小时前
HAProxy 负载均衡全解析:从基础部署、负载策略到会话保持及性能优化指南
运维·负载均衡·haproxy
M1A12 小时前
Linux:数字世界的隐形基石与开源革命的王者
linux·后端·操作系统
青草地溪水旁3 小时前
VMware 设置 Ubuntu 虚拟机桥接模式完整教程
linux·ubuntu·桥接模式
淮北4943 小时前
linux系统学习(4.常用命令)
linux·运维·学习