使用sed为hadoop-env.sh添加JAVA_HOME时提示文件不存在(实际存在)求助
嘿,我来帮你捋捋这个头疼的问题——明明$HADOOP_HOME/etc/hadoop/hadoop-env.sh就在那儿,sed却偏说找不到,这事确实挺迷惑的。咱们一步步拆解排查:
1. 先确认命令实际展开的路径对不对
先在终端敲这个命令,看看实际路径是不是你预期的:
echo $HADOOP_HOME/etc/hadoop/hadoop-env.sh
如果输出是/usr/share/hadoop/etc/hadoop/hadoop-env.sh,那路径没问题;如果不是,说明$HADOOP_HOME没正确导出,先执行export HADOOP_HOME=/usr/share/hadoop,再跑sed命令试试。
2. 重点修复sed命令里的路径转义和空格坑
你的JAVA_HOME路径是Windows风格的,带了反斜杠\和空格,这在Linux shell里简直是“语法炸弹”:
- 反斜杠
\是shell的转义字符,比如c:\Program会被解析成c:Program(反斜杠直接丢了) - 空格会让shell把
Program Files拆成两个独立参数,sed会误以为Files是另一个要处理的文件,直接导致命令解析混乱
给你两种靠谱的修正写法:
写法一(推荐):用正斜杠+单引号包裹路径
把Windows的反斜杠换成Linux的正斜杠,再用单引号把整个JAVA_HOME路径包起来,避免shell瞎解析:
sed -i "\$aexport JAVA_HOME='c:/Program Files (x86)/Java/jre1.8.0_151/bin'" $HADOOP_HOME/etc/hadoop/hadoop-env.sh
写法二:转义所有特殊字符
如果非要用反斜杠,就得把空格、括号、反斜杠都转义一遍(这种写法太啰嗦,不推荐,但可以参考):
sed -i "\$aexport JAVA_HOME=c:\\\\Program\ Files\ \(x86\)\\\\Java\\\\jre1.8.0_151\\\\bin" $HADOOP_HOME/etc/hadoop/hadoop-env.sh
3. 检查文件权限是否足够
虽然你的报错是找不到文件,但也有可能是权限问题(比如你没写入权限,sed报错信息可能有点误导)。先看看文件权限:
ls -l $HADOOP_HOME/etc/hadoop/hadoop-env.sh
如果文件所有者是root,就得用sudo执行命令,记得sudo下最好用完整路径,避免环境变量失效:
sudo sed -i "\$aexport JAVA_HOME='c:/Program Files (x86)/Java/jre1.8.0_151/bin'" /usr/share/hadoop/etc/hadoop/hadoop-env.sh
4. 验证sed的语法兼容性(备用排查)
不同系统的sed语法有点差异,比如GNU sed(大部分Linux用这个)和BSD sed(Mac用)的-i选项写法不一样。如果是GNU sed,你当前的-i语法没问题;如果是BSD sed,得写成-i '':
sed -i '' "\$aexport JAVA_HOME='c:/Program Files (x86)/Java/jre1.8.0_151/bin'" $HADOOP_HOME/etc/hadoop/hadoop-env.sh
不过这个可能性较低,毕竟你的报错是找不到文件,不是语法错误,但可以当最后一步排查。
内容的提问来源于stack exchange,提问作者Gary Beckler

