在 Ubuntu 环境下 sh 脚本运行因为 Bash 改用 Dash 语法报错问题

在 Ubuntu 环境下 sh 脚本运行的语法报错

开发时遇到了运行 sh 脚本时提示 Syntax Error 的问题,下面给出问题原因和解决方案

前情提要

某日开发时需要使用 build.sh 编译项目,但是会出现 Syntax error 报错:

复制代码
./build.sh: 11: ./build.sh: Syntax error: "(" unexpected

同时另外一个脚本也会出现类似情况:

复制代码
Segmentation fault
./setup_config.sh: 36: ./setup_config.sh: Syntax error: redirection unexpected

此脚本的第 36 行内容为:

复制代码
name=$(tr [A-Z] [a-z] <<< $name)

问题溯源

经过查找资料,发现问题是由于 Ubuntu 系统在 6.10 版本后从 Bash 改用 Dash,将 /bin/sh 指向 /bin/dash 导致的;而 Bash 和 Dash 之间有语法上的差别,比如上文中的 <<< 符号,在 Dash 中不支持,因此会产生语法错误、段错误等等奇怪的情况。

通过查看 /bin 目录内的文件可以发现这个问题:

复制代码
lrwxrwxrwx 1 root root 4 May 30 2023 /bin/sh -> dash

解决方案

由于 Dash 本身相当于 Bash 的子集,改用 Bash 不会产生不兼容的问题,因此在 /bin 目录中修改软链接的指向即可:

复制代码
sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh

再次检查软链接的情况,可以看到这个软链接已经正确修改了:

复制代码
lrwxrwxrwx 1 root root 9 Jan 8 16:50 /bin/sh -> /bin/bash

此时再次运行编译脚本,已经可以正常运行了。

相关推荐
zhangrelay4 天前
《机器人控制器设计与编程》课程习题资料-2026
linux·笔记·学习·ubuntu
Linux-lucky5 天前
39-41-Linux学习之旅之redis缓存基础与NFS基础
linux·运维·mysql·ubuntu
QQ14220784495 天前
2012 年的老 ThinkPad E430 改装 Ubuntu 24.04全程翻车排查实录
ubuntu·项目复盘
阿钱真强道5 天前
06 嵌入式操作系统 | vim 与软件管理:apt / 源码编译
ubuntu·vim·嵌入式·apt·源码编译
牢姐与蒯5 天前
Linux进程间通信(三).基于匿名管道的进程池的实现
linux·运维·服务器·ubuntu
Linux-lucky5 天前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
士訫5 天前
【Linux 踩坑】HP Victus RTX4050 Ubuntu 系统双屏无法同时点亮解决方案(完美适配 Advanced Optimus 机型)
ubuntu
指尖的爷5 天前
ARM 架构 Ubuntu(RK3588/aarch64)go开发环境安装手册
ubuntu·架构·golang
虚无的纽扣6 天前
【Linux】将进程知识与基础IO融会贯通——简单自定义Shell的实现
linux·ubuntu
问简6 天前
Ubuntu 26 + Windows 10 双系统 NTFS 共享盘笔记
ubuntu