shell命令扩展
文章目录
- 前言
- 一、逻辑运算符
- 1.1 逻辑运算符 &&
- 1.2 逻辑运算符 ||
- 1.3 组合注意
- 二、echo
- 2.1 标准输出(stdout)
- 2.2 输出到标准错误(stderr)
- 三、标准文件描述符(FD)
- 3.1 描述符说明
- 3.2 示例演示
- 3.2.1 stdout/stderr
- 3.2.2 只把 stdout 重定向到文件,但 stderr 不重定向
- 四、重定向:>(覆盖)与 >>(追加)
- 4.1 覆盖重定向(>)
- 4.2 追加重定向(>>)
- 4.3 重定向错误输出:2> / 2>>
- 五、同时重定向 stdout 与 stderr
- 5.1 POSIX推荐写法
- 5.2 Bash 特殊简写(bash/ksh/zsh)
- 六、输出丢弃 /dev/null
- 6.1 丢弃(stderr)
- 6.2 同时丢弃两者
- 七:管道 |(顺便说明,与重定向的区别)
- 7.1 基本用法
- 7.2 stderr 通过管道传给下一个命令
- 八、高级技巧:自定义文件描述符
- 九、小结
- 重定向和管道操作符总结
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、逻辑运算符
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) |
总结
作者很懒,没写总结