Linux Shell 中的 dash 符号 “-”

Shell中的-:小符号的大智慧

在Unix/Linux系统中,-符号是一个约定俗成的特殊标记,它表示命令应该使用标准输入或标准输出而非文件。这个看似简单的短横线,完美诠释了Unix"一切皆文件"的设计哲学。

作为标准输入/输出的替身,-让命令可以像处理文件一样处理数据流。通过管道(|)连接的命令,借助-实现了无缝的数据传递。

-的智慧不止于此。它还常被用来:

  • 表示选项默认值
  • 标识特殊文件位置
  • 终止参数解析

这种设计体现了Unix的简约哲学:用最简单的符号,解决最复杂的问题。正如Unix创始人Ken Thompson所说:“简洁就是美。”


一、表示标准输入/输出

这是-符号最常见的用法,代表标准输入(stdin)或标准输出(stdout)。

1. 归档压缩工具

# tar: 打包到标准输出
tar -cvf - directory | ssh user@host "tar -xvf - -C /target"# gzip: 压缩到标准输出
gzip -c file.txt > file.txt.gz# gunzip: 从标准输入解压
cat file.txt.gz | gunzip -c > file.txt

2. 文件处理

# cat: 合并标准输入和文件
echo "Header" | cat - data.csv > combined.csv# diff: 比较标准输入与文件
echo "new content" | diff - old_file.txt# patch: 从标准输入打补丁
curl -s http://patch.site | patch -p1 -i -

3. 远程操作

# ssh: 通过标准输入执行脚本
cat script.sh | ssh user@host 'bash -s -- arg1 arg2'# scp/rsync替代方案
tar -cf - /local/dir | ssh user@host "tar -xf - -C /remote/dir"

二、表示选项的默认值

某些命令使用-来表示使用默认值或默认行为。

1. 压缩工具

# bzip2: 使用默认压缩级别
bzip2 -c - file.txt > file.txt.bz2

2. 文本处理

# sort: 使用默认排序规则
cat unsorted.txt | sort - > sorted.txt# uniq: 使用默认去重方式
sort file.txt | uniq - > unique.txt

3. 系统工具

# ls: 列出标准输入中的文件
find . -name "*.txt" | ls -

三、表示特殊文件位置

1. 设备文件

# dd: 使用标准输入/输出作为设备
dd if=- of=/dev/sdc bs=4M  # 从stdin写入设备
dd if=/dev/sdc of=- bs=4M  # 从设备读取到stdout

2. 临时文件

# mktemp: 创建临时文件
TMPFILE=$(mktemp -)
echo "temp data" > $TMPFILE

四、表示命令行参数终止

在复杂命令中,--表示选项结束,后面的参数即使以-开头也不作为选项解析。

# 删除名为"-f"的文件
rm -- -f# grep搜索以"-"开头的内容
echo "-test" | grep -- "-"

五、特殊命令中的用法

1. echo/printf

# 输出到标准错误
echo "Error" >&2
printf "%s\n" - >&2

2. xargs

# 从标准输入获取参数
find . -name "*.tmp" | xargs rm -

六、使用建议与注意事项

  1. 兼容性检查:不是所有命令都支持-,特别是非GNU工具

    man command | grep "\- "
    
  2. 明确替代方案:考虑使用/dev/stdin/dev/stdout提高可读性

    cmd1 | cmd2 /dev/stdin
    
  3. 性能对比:对于大文件,临时文件可能比管道更高效

    cmd1 > temp && cmd2 temp && rm temp
    
  4. 错误处理:管道中注意错误传递

    set -o pipefail
    cmd1 | cmd2 || echo "Pipeline failed"
    

七、实战案例

数据库备份传输

# MySQL直接备份到远程服务器
mysqldump -u user -p dbname | gzip -c - | ssh user@host "gunzip -c - | mysql -u user -p dbname"

日志分析管道

# 多步骤日志处理
cat app.log | grep "ERROR" - | sort - -u | tee errors.txt | mail -s "Error report" admin@site.com

通过这种分类学习,你可以更系统地掌握-符号的各种用法,在实际工作中灵活选择最适合的方案。记住,理解原理比死记硬背命令更重要!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter 实现 MQTT 协议压力测试 !

想象一下,你的智能家居系统连接了上千个设备,传感器数据通过 MQTT 协议飞速传输,但突然服务器崩溃,灯光、空调全失控!如何确保你的 MQTT 经纪人能承受高负载?答案是 JMeter!通过安装 MQTT 插件&…

CKA考试知识点分享(6)---PriorityClass

CKA 版本:1.32 第六套题是涉及PriorityClass相关。 注意:本文不是题目,只是为了学习相关知识点做的实验。仅供参考 实验目的 创建一套PriorityClass ,验证PriorityClass的运作策略。 1 环境准备 创建2个pc,一个为高…

暴力破解篇补充-字典

在皮卡丘靶场的第二期,暴力破解模块中,我相信大家短暂的接触了字典这个概念,字典事实上就是包含了大量弱口令的txt文本文件 所以这篇文章用于分享一些字典:https://wwhc.lanzoue.com/ihdl12ybhbhi(弱口令字典&#xff…

关于VS2022中C++导入第三方库的方式

首先,新建一个Cpp项目(控制台项目即可,其他项目也无所谓),右键点击项目名称(Test1)选择属性或者在VS2022工具栏选择调试标签->属性按钮打开属性页。 注意点: 在开始其他操作前请注意先进行 配置和平台选项框的选择。配置选框选定了是配置…

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制

在现代Web开发中,暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSS在React项目(Vue项目类似)中实现两种暗黑模式控制方式: 系统自动适配 - 根据用户设备偏好自动切换手动切换 - 通过按钮让用户自由选择 一、项目准备 使…

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…

Tomcat 安装和配置

一、Tomcat官网 Apache Tomcat - Welcome! 选择解压到任意一个盘!! 二、Tomcat配置 1)在系统变量处新建一个变量CATALINA_HOME。CATALINA_HOME环境变量的值,设置为Tomcat的解压安装目录 2)找到系统变量Path&#xff0…

动态规划 熟悉30题 ---上

本来是要写那个二维动态规划嘛,但是我今天在问题时候,一个大佬就把他初一时候教练让他练dp的30题发出来了(初一,啊虽然知道计算机这一专业,很多人从小就学了,但是我每次看到一些大佬从小学还是会很羡慕吧或…

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注:成品使用演示、项目源码、项目文档在文章末尾网盘链接中自取 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …

时间同步技术在电力系统中的应用

随着电力自动化技术的发展,时间同步不仅可以为电力系统的事后故障分析提供支持,而且已经参与到电力系统的实时控制中来,其可靠性对电力系统的稳定运行影响越来越大。在电力系统中,时间同步技术广泛应用于调度控制中心、发电厂、变…

XMLGregorianCalendar跟Date、localDateTime以及String有什么区别

1. java.util.Date(已过时,不推荐新代码使用) 特点 表示时间戳:存储自 1970-01-01 00:00:00 UTC(Unix 纪元) 以来的毫秒数。 问题: 不区分日期和时间,也没有时区支持(依…

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…

玩转抖音矩阵:核心玩法与高效运营规则

一、 抖音矩阵:流量协同的生态网络 抖音矩阵,本质是运营一个相互关联、互相支持的抖音账号群。核心目标在于通过账号间的深度协同(内容、流量、粉丝),打破单个账号的流量天花板,实现11>2的效果。它不仅…

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…

用电脑通过USB总线连接控制keysight示波器

通过USB总线控制示波器的优势 在上篇文章我介绍了如何通过网线远程连接keysight示波器,如果连接的距离不是很远,也可以通过USB线将示波器与电脑连接起来,实现对示波器的控制和截图。 在KEYSIGHT示波器DSOX1204A的后端,除了有网口…

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…

02 Deep learning神经网络的编程基础 逻辑回归--吴恩达

1.逻辑回归 逻辑回归是一种用于解决二分类任务(如预测是否是猫咪等)的统计学习方法。尽管名称中包含“回归”,但其本质是通过线性回归的变体输出概率值,并使用Sigmoid函数将线性结果映射到[0,1]区间。 以猫咪预测为例 假设单个…

UDP 与 TCP 的区别是什么?

UDP(用户数据报协议)与TCP(传输控制协议)有以下区别: 连接方式 - UDP:无连接,发送数据前不需要建立连接,也不维护连接状态,因此UDP的通信效率较高,适合对实时…

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…