bash - 了解花括号对重定向的影响("> file1 >& file2" vs. "{ > file1; } >& file2")
问题描述
请考虑以下 bash 脚本:
#!/bin/bash
touch ./temp
set -C
>./temp &>/dev/null # Visible error message output ("./test7: line 7: ./temp: cannot overwrite existing file")
{ >./temp; } &>/dev/null # No error message
有人可以解释一下为什么倒数第二行中的重定向导致的错误消息没有被尾随 抑制&>/dev/null
,而它在最后一行中按预期工作?
我研究了 bash 手册中有关重定向和复合命令的段落(特别是有关组命令的部分),但无法做出解释。毕竟,由于花括号中只有一个命令,所以离开花括号应该不会改变任何东西,不是吗?差异是否与 bash 解析行的顺序有关?
解决方案
根据 bash 手册(man bash
):
重定向按照它们出现的顺序进行处理,从左到右。[...] 请注意,重定向的顺序很重要。
对于> temp >& /dev/null
,当 bash 处理该> temp
部分时,stderr 仍然指向 tty,因此您可以看到错误。你可以这样验证:
[STEP 101] $ set -C
[STEP 102] $ date >> temp
[STEP 103] $
[STEP 104] $ > temp
bash: temp: cannot overwrite existing file
[STEP 105] $ > temp >& /dev/null
bash: temp: cannot overwrite existing file
[STEP 106] $
[STEP 107] $ >& /dev/null > temp
[STEP 108] $ 2> /dev/null > temp
[STEP 109] $
对于{ > temp; } &> /dev/null
,{ > temp; }
被作为复合命令处理,其输出作为一个整体被 重定向&> /dev/null
。
推荐阅读
- javascript - 使用 JavaScript 构建 SVG 图标
- flutter - Obx 不工作 - Flutter Getx 包
- c# - 在 C# WinForm 中的窗口后面截屏
- c - 在 C 中使用“框模糊”技术模糊 image.bmp
- flutter - 当用户未登录时,颤动重定向到登录小部件(有状态类)?
- python - 如何让循环创建函数?
- regex - 相对路径的 VS 代码片段正则表达式
- file-upload - 无法在 Play 管理中心上传 APK 文件,要求 AAB 文件扩展
- node.js - 为数字海洋部署配置基本 url nuxt
- pandas - 使用分钟柱数据(多只股票,一个 df 中的多个会话)获取不完整每日柱的股票日低 (LOD) 价格 SettingWithCopyWarning