Mac电脑使用sed替换功能报错处理

本文探讨了SED命令在Linux与Mac系统中的使用差异,特别是在处理文件替换时的-i选项的不同用法。同时,文章还总结了在SED中使用变量的四种常见方案,为跨平台开发提供了实用指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sed linux 和mac的区别

sed是linux命令

sed -i "3 s/[0-9]*\.[0-9]*\.[0-9]*/$version/g" package.json

但是运行在Mac中需要在-i后面添加 "“或者”_bak"用于备份文件

sed -i "" "3 s/[0-9]*\.[0-9]*\.[0-9]*/$version/g" package.json

sed 中使用变量

网上有人总结了四种方案:

  1.   eval sed 's/$a/$b/' filename
    
  2.   sed "s/$a/$b/" filename
    
  3.   .sed 's/'$a'/'$b'/' filename
    
  4.   .sed s/$a/$b/ filename
    

学习帖子:
https://www.jianshu.com/p/556f2c73668f
https://blog.youkuaiyun.com/wangcg123/article/details/50667883

<think>我们面对的问题是在Mac环境下运行entrypoint.sh脚本时出现'resource deadlock avoided'错误。这个错误通常与文件描述符(file descriptors)或进程间通信(IPC)资源有关,特别是在并发操作或资源竞争的情况下。 ### 错误原因分析 1. **文件描述符限制**:MacOS对每个进程可打开的文件描述符数量有限制。如果脚本中打开的文件(包括管道、套接字等)过多,可能超过限制导致死锁。 2. **并发操作冲突**:脚本中可能使用了并行执行(如`&`后台进程或`xargs -P`等),当多个进程同时竞争同一资源(如写入同一文件)时,可能引发死锁。 3. **管道使用不当**:在管道命令链中,如果某个命令读取端关闭而写入端仍在写入(或反之),可能触发此错误。 ### 解决步骤 #### 步骤1: 检查文件描述符限制 在终端中执行: ```bash ulimit -n ``` 查看当前文件描述符限制(默认值通常为256)。如果脚本需要更多文件描述符,可以临时提高限制: ```bash ulimit -n 1024 # 设置新的限制,仅在当前shell生效 ./entrypoint.sh ``` #### 步骤2: 检查脚本中的并发操作 打开`entrypoint.sh`,检查是否存在以下情况: - 使用`&`启动后台进程 - 使用`xargs -P`或`parallel`进行并行处理 - 多个进程写入同一文件 如果存在,尝试: 1. 减少并发进程数(如将`xargs -P 8`改为`xargs -P 4`)。 2. 确保对共享资源的访问是同步的(例如使用`flock`加锁)。 #### 步骤3: 检查管道命令 确保管道命令链中每个命令都能正常退出。例如: ```bash command1 | command2 | command3 ``` 如果`command2`提前退出,可能导致`command1`写入管道时失败。可以添加`wait`命令确保所有后台进程完成。 #### 步骤4: 使用`dtrace`或`lsof`跟踪资源 运行脚本时,使用`lsof`监控文件描述符使用情况: ```bash lsof -p $$ # 查看当前shell打开的文件 ``` 或使用`dtrace`(需sudo权限)跟踪系统调用。 #### 步骤5: 更新系统或软件 确保系统及相关工具(如`bash`)为最新版本。使用Homebrew更新: ```bash brew update brew upgrade bash coreutils ``` ### 示例修改 假设脚本中有并行处理代码: ```bash find . -name "*.txt" | xargs -P 8 -I{} sed -i '' 's/foo/bar/g' {} ``` 可改为减少进程数并添加等待: ```bash find . -name "*.txt" | xargs -P 4 -I{} sed -i '' 's/foo/bar/g' {} & wait # 确保所有后台任务完成 ``` ### 其他建议 - 在脚本开头添加`set -euo pipefail`,使脚本在错误时立即退出,便于定位问题。 - 使用`exec 3>&1 4>&2`等命令管理文件描述符。 通过以上步骤,应能解决大多数'resource deadlock avoided'错误[^1]。 §§相关问题§§ 1. 如何永久提高MacOS的文件描述符限制? 2. 在Shell脚本中如何安全地实现并发控制? 3. 除了`lsof`,还有哪些工具可以诊断MacOS资源死锁?</think>### 解决Mac执行entrypoint.sh报错"resource deadlock avoided" 这个错误通常发生在进程间通信(IPC)或文件描述符操作中出现资源竞争时,特别是在使用管道(`|`)、重定向(`>`)、或并发任务(`&`)的场景下。以下是系统性解决方案: --- #### 1. **检查文件描述符限制** MacOS默认限制每个进程打开的文件描述符数量(通常256)。执行: ```bash # 查看当前限制 ulimit -n # 临时提高限制(当前会话有效) ulimit -n 1024 ``` #### 2. **修复脚本中的并发冲突** 检查`entrypoint.sh`中是否存在: - 管道命令链过长:`cmd1 | cmd2 | cmd3 ...` - 后台任务(`&`)与管道混用 - 对同一文件的并发读写 **修改方案:** ```bash # 原问题代码示例 do_task1 | process_output & # 可能冲突 # 改为顺序执行或显式等待 do_task1 > temp_file process_output < temp_file & wait # 确保后台任务完成 ``` #### 3. **检查文件锁竞争** 如果脚本使用`flock`或文件锁: ```bash # 问题代码 ( flock -n 9 || exit 1 # ...操作 ) 9>lockfile # 解决方案:增加超时和重试 for i in {1..5}; do flock -w 10 -n 9 && break sleep 1 done || exit 1 ``` #### 4. **诊断资源泄漏** 使用`lsof`监控脚本运行时的文件描述符: ```bash # 实时监控描述符使用 while true; do lsof -p $(pgrep -f entrypoint.sh); sleep 1; done ``` 若发现持续增长未关闭的描述符,需在脚本中显式关闭: ```bash exec 3>&- # 关闭描述符3 ``` #### 5. **更新系统组件** 某些旧版Mac工具(如`bash`)存在并发缺陷: ```bash # 通过Homebrew更新核心工具 brew update brew upgrade bash coreutils findutils ``` #### 6. **重写高并发逻辑** 对于复杂管道,改用临时文件: ```bash # 替换长管道链 cmd1 > tmp1 cmd2 < tmp1 > tmp2 cmd3 < tmp2 # 替代方案:命名管道 mkfifo mypipe cmd1 > mypipe & cmd2 < mypipe ``` --- ### 关键预防措施 1. **添加资源清理**:在脚本退出前显式关闭描述符 ```bash trap 'exec 3>&-; rm -f tmp_*' EXIT ``` 2. **限制并发度**:使用`xargs -P`时控制进程数 ```bash find . -print0 | xargs -0 -P 4 -n 1 command ``` 3. **使用现代工具**:避免`bash <4.4`的管道缺陷,可通过`brew install bash`升级 > 实测案例:某CI脚本在减少管道链长度并添加`wait`后解决死锁问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值