dash bash sh 的关系 编译错误: /bin/sh: 1: pushd: not found的问题

在某些平台SDK编译中,Ubuntu系统因脚本是sh,编译会报错“/bin/sh: 1: pushd: not found”。原因是sh命令链接到dash,而pushd需在bash环境执行。解决方法是执行sudo dpkg-reconfigure dash命令,将dash设为No,使sh链接到bash。

编译错误: /bin/sh: 1: pushd: not found的问题
2016年12月03日 10:48:08 阅读数:4183更多
个人分类: Linux

说明:在某些平台SDK编译中Linux脚本需要改为bin/bash,由于Ubuntu系统模式的脚本是sh,安装SDK之后,编译过程一定会出现错误,所以必须要先更改默认的bash才行 。

ubuntu环境中报如下错误:

查看原因:

进入/bin目录,查看sh的链接文件,显示如下:表示sh命令链接到的是dash,而pushd命令需要在bash的环境中执行。

解决方法:

执行sudo dpkg-reconfigure dash 命令,将dash设置为No。

再次查看sh的链接:已经修改为bash了。

ls -lh sh

root@fb0699a0389b:/host_home/user/LLM-TPU# cat run.sh #!/bin/bash set -ex # Args parse_args() { while [[ $# -gt 0 ]]; do key="$1" case $key in --model) model="$2" shift 2 ;; --arch) arch="$2" shift 2 ;; *) echo "Invalid option: $key" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done } # Mapping declare -A model_to_demo=( ["chatglm2-6b"]="ChatGLM2" ["chatglm3-6b"]="ChatGLM3" ["llama2-7b"]="Llama2" ["llama3-7b"]="Llama3" ["qwen-7b"]="Qwen" ["qwen1.5-1.8b"]="Qwen1_5" ["qwen2.5-7b"]="Qwen2_5" ["wizardcoder-15b"]="WizardCoder" ["lwm-text-chat"]="LWM" ["internvl2-4b"]="InternVL2" ["minicpmv2_6"]="MiniCPM-V-2_6" ["molmo-7b"]="Molmo" ) # Process Args parse_args "$@" # Check Version compare_date="20240110" if [ $arch == "pcie" ]; then extracted_date=$(cat /proc/bmsophon/driver_version | grep -o 'release date: [0-9]\{8\}' | grep -o '[0-9]\{8\}') elif [ $arch = "soc" ]; then extracted_date_str=$(uname -a | grep -oP 'SMP \K[A-Za-z]+\s[A-Za-z]+\s\d+\s\d+:\d+:\d+\s[A-Za-z]+\s\d+' | sed 's/HKT //') extracted_date=$(date -d "$extracted_date_str" '+%Y%m%d') fi if [ "$extracted_date" -lt "$compare_date" ]; then >&2 echo -e "Your driver is \033[31moutdated\033[0m. Please update your driver." exit 1 else echo "Driver date is $extracted_date, which is up to date. Continuing..." fi # Function to validate model name validate_model() { local model="$1" if [[ ! ${model_to_demo[$model]} ]]; then echo -e "Error: Invalid name $model, the input name must be \033[31m$(printf "%s|" "${!model_to_demo[@]}" | sed 's/|$//')\033[0m" >&2 return 1 fi return 0 } # Check Model Name validate_model "$model" || exit 1 # Compile pushd "./models/${model_to_demo[$model]}" ./run_demo.sh popd root@fb0699a0389b:/host_home/user/LLM-TPU# bash +x run.sh --model /host_home/user/LLM-TPU/models/Qwen2_5 : invalid optionset: - set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] run.sh: line 3: $'\r': command not found run.sh: line 5: syntax error near unexpected token `$'{\r'' 'un.sh: line 5: `parse_args() {
05-11
在执行脚本或命令时遇到 `/bin/sh: 1: source: not found` 错误,通常是因为默认的 shell 解释器是 `dash`,而不是 `bash`。`dash` 是一个轻量级的 shell,不具备 `bash` 中的一些高级功能,例如 `source` 命令(用于读取并执行指定文件中的命令)。 ### 解决方案 1. **使用 `bash -c` 替代 `source` 命令** 在脚本或 Dockerfile 中,将 `source` 命令替换为 `bash -c` 执行,以确保使用的是 `bash` 而不是 `dash`。 例如: ```bash /bin/bash -c "source /root/.bashrc" ``` 2. **修改默认 shell 为 bash** 如果希望 `/bin/sh` 指向 `bash` 而不是 `dash`,可以重新配置系统默认的 shell。在基于 Debian 的系统中,可以通过以下命令实现: ```bash sudo dpkg-reconfigure dash ``` 在提示中选择 `No`,这样 `/bin/sh` 将指向 `bash` 而不是 `dash` [^3]。 3. **显式使用 `bash` 执行脚本** 在脚本的开头指定使用 `bash`,而不是默认的 `sh`。例如: ```bash #!/bin/bash source /root/.bashrc ``` 这样可以确保脚本在 `bash` 环境下运行,从而支持 `source` 命令 [^1]。 4. **检查环境变量和 PATH** 如果问题出现在 Docker 容器中,需要确保容器内安装了 `bash`,并且 `PATH` 环境变量中 `bash` 的路径优先于 `dash`。此外,确保 `.bashrc` 文件存在于容器中,并且路径正确 [^3]。 5. **使用 `.` 代替 `source`** `.` 是 `source` 的替代命令,它在 `dash` 中也受支持。例如: ```bash . /root/.bashrc ``` 这种方法可以避免依赖 `bash` 的 `source` 命令 [^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值