shell命令扩展

发布于:2025-08-31 ⋅ 阅读:(25) ⋅ 点赞:(0)


前言

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

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


一、逻辑运算符

1.1 逻辑运算符 &&

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

示例:

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

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

在这里插入图片描述

1.2 逻辑运算符 ||

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

示例:

false || echo "左侧失败,执行此处"
左侧失败,执行此处```

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

在这里插入图片描述

1.3 组合注意

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

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

在这里插入图片描述

二、echo

2.1 标准输出(stdout)

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

$ echo "hello world"
hello word

在这里插入图片描述

2.2 输出到标准错误(stderr)

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

echo "this is error" >&2
这会把文本发送到 stderr

在这里插入图片描述

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

3.1 描述符说明

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

3.2 示例演示

3.2.1 stdout/stderr
echo "out"
out # 到 stdout
echo "err" >&2
err # 到 stderr

在这里插入图片描述

3.2.2 只把 stdout 重定向到文件,但 stderr 不重定向
ls /no/such/path >out.txt
# 终端会显示错误信息(stderr),out.txt 为空或不存在

在这里插入图片描述

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

4.1 覆盖重定向(>)

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

echo "first" > file.txt
echo "second" > file.txt
cat file.txt
second

在这里插入图片描述

4.2 追加重定向(>>)

含义:
”>>“把 stdout 追加到文件末尾

echo "first" > file.txt
$ echo "second" >> file.txt
$ cat file.txt
first
second

在这里插入图片描述

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

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

ls /no/such/path 2>err.txt
cat err.txt
ls: cannot access '/no/such/path': No such file or directory

在这里插入图片描述
追加示例:

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

在这里插入图片描述

五、同时重定向 stdout 与 stderr

5.1 POSIX推荐写法

格式:command >out.txt 2>&1

含义:
先把 stdout 重定向到 out.txt ,再把 stderr(2)重定向到当前 stdout(1)指向的位置(也就
是 out.txt )。结果:stdout 和 stderr 都写入 out.txt 。
示例:

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

在这里插入图片描述
注意顺序(很重要)

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

这条会把 stderr 重定向到 最初的 stdout(终端),然后再把 stdout 重定向到文件,结果是:错误仍
打印到终端,而文件里只有 stdout 内容。
在这里插入图片描述

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

格式:

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

示例:
在这里插入图片描述

六、输出丢弃 /dev/null

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

示例:

只保留 stderr,丢弃 stdout:
some_command > /dev/null

在这里插入图片描述

6.1 丢弃(stderr)

示例:

some_command 2> /dev/null

丢弃strerr,保留strout
在这里插入图片描述

6.2 同时丢弃两者

some_command > /dev/null 2>&1
# 或(bash):
some_command &> /dev/null

在这里插入图片描述

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

含义:
把前一个命令的 stdout 作为下一个命令的 stdin。默认只传输 stdout,不包含 stderr(除非你把
stderr 重定向到 stdout)。

7.1 基本用法

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

示例:

echo -e "apple\nbanana" | grep banana
banana

在这里插入图片描述

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

示例:

command 2>&1 | grep something
# 或(bash):
command |& grep something

把 stdout 和 stderr 都传给后面

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

在这里插入图片描述

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

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

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)
| 管道仅传递 stdout
2>&1 | 管道传递 stdout 和 stderr
|& 管道传递 stdout 和 stderr(bash)

总结

作者很懒,没写总结


网站公告

今日签到

点亮在社区的每一天
去签到