Mac下Bash脚本无法创建.env文件:只读文件系统报错
解决Bash脚本创建.env时的"Read-only file system"错误
问题根源
你脚本里定义了SCRIPT_DIR变量存储脚本所在目录,但写入文件时误用了未定义的$dir变量,导致系统尝试写入根目录/.env(空变量拼接后路径为/.env),而根目录通常是只读挂载的,因此触发报错。
修复步骤
- 修正变量名:将写入路径中的
$dir替换为你已定义的$SCRIPT_DIR - 让
echo解析换行符:默认echo不会识别\n,需添加-e参数才能生成正确换行的.env内容 - 统一路径引用:读取文件时也使用完整路径,避免当前工作目录不一致导致的问题
修复后的完整脚本:
#!/usr/bin/env bash # 用ip命令替代ifconfig(兼容更多现代Linux发行版) ip=$(ip addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -n1) SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) echo "脚本所在目录: $SCRIPT_DIR" # 使用-e解析换行符,并用正确变量指定.env路径 echo -e "REACT_APP_BASE_API=https://$ip:3030/api/\nCOOKIE_TOKEN_KEY=\nREACT_APP_WEB_SOCKET_URL=wss://$ip:3030/one2one" > "$SCRIPT_DIR/.env" # 读取刚创建的.env文件 cat "$SCRIPT_DIR/.env"
额外优化建议
- 路径变量加双引号:所有包含路径的变量都用双引号包裹,避免目录名含空格时出现异常
- 处理多IP场景:如果机器有多个网卡,
head -n1会取第一个非本地IP,可根据实际需求调整IP筛选逻辑 - 兼容macOS:若在macOS运行,可将
ip addr换回ifconfig,或安装iproute2mac工具实现兼容
内容的提问来源于stack exchange,提问作者agam theos
相关产品推荐
相关产品推荐

