ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

shell语法“2>/dev/null”:错误直接丢弃

shell语法“2>/dev/null”:错误直接丢弃 “2/dev/null”是一个常见的 Shell 重定向Redirection 基础语法表示遇到错误直接丢弃。一个使用场景# macOS Keychain 里删除指定的(MY_SERVICE_NAME,MY_ACCOUNT_NAME)密码记录 # 加了 2/dev/null 后表示即使没找到这个记录也别报错 security delete-generic-password -s MY_SERVICE_NAME -a MY_ACCOUNT_NAME 2/dev/null下面解释下 “2/dev/nul” 各段含义。1.“2”代表「标准错误流」Unix/Linux 系统默认给每个程序打开3个标准数据流管道它们各自有一个固定的编号文件描述符编号名称缩写默认去向作用0标准输入stdin键盘接收用户输入1标准输出stdout屏幕打印正常结果2标准错误stderr屏幕打印报错信息重点正常输出和错误是完全独立的两个管道不会互相干扰。比如你执行一个不存在的命令abc弹出的「命令不存在」提示就是走的2号错误管道。2.“”是「重定向符号」的作用是把左边管道的输出写到右边指定的地方而不是默认输出到屏幕。你平常写echo hello a.txt其实是echo hello 1 a.txt的简写1可以省略意思是把正常输出写到a.txt文件里。要重定向错误流就必须明确指定管道编号2 xxx意思是把错误信息写到xxx里。1 file.txt 或 file.txtShell 会把 1标准输出 重定向到文件1是默认值可以省略。2 file.txt就是告诉 Shell 只把编号为 2 的“标准错误”重定向到文件正常的输出依然打印在屏幕上。3.“/dev/null”是「黑洞设备」/dev/null是 Unix/Linux 系统中的一个特殊的虚拟设备文件。它的特性极其简单粗暴写入它的数据会被立刻丢弃不占用任何存储空间。从它读取数据会永远返回空。可以把它想象成一个无底洞或垃圾桶无论往里扔多少东西都会瞬间消失。4. 组合 “2/dev/null”把上面三部分拼在一起逻辑就非常清晰了2/dev/null 把“标准错误2”这个数据流重定向到“黑洞/dev/null”里。结果就是命令执行过程中产生的所有报错信息都被扔进了黑洞终端屏幕上干干净净什么都不会显示。举例当执行一个不存在的命令# 不加2/dev/null会打印错误到屏幕 $ abc zsh: command not found: abc # 加2/dev/null错误直接丢弃屏幕啥也不输出 $ abc 2/dev/null5. 回到开头的例子# macOS Keychain 里删除指定的(MY_SERVICE_NAME,MY_ACCOUNT_NAME)密码记录 security delete-generic-password -s MY_SERVICE_NAME -a MY_ACCOUNT_NAME 2/dev/nullsecurity delete命令里加这个参数的目的就是如果钥匙串里本来就没有要删除的记录security命令会报「找不到条目」的错误但我们不关心这个错误本来就是要删不存在就不用删所以直接把错误丢掉避免脚本输出冗余的报错信息。security是macOS 内置的钥匙串Keychain命令行工具。macOS 会把密码、证书等敏感信息加密存在钥匙串里。security是官方命令行接口几个常见子命令子命令作用add-generic-password添加一条密码find-generic-password查找一条密码delete-generic-password删除一条密码解析security delete-generic-password -s MY_SERVICE_NAME -a MY_ACCOUNT_NAME 2/dev/null部分含义securitymacOS 钥匙串的 CLI 工具内置delete-generic-password子命令删除一条通用密码generic password。-s MY_SERVICE_NAME-s service服务的标识。相当于这条密码属于哪个服务-a MY_ACCOUNT_NAME-a account账户名。用来区分同一服务下不同用户2/dev/null把标准错误丢弃。忽略命令报错信息Keychain 里每条记录由 (service, account) 这对组合唯一定位相当于数据库的主键。
返回列表