linux下执行脚本,提示Command not found解决办法

解决Linux下.sh脚本执行错误
本文介绍了解决Linux环境下执行.sh脚本时出现的错误:bin/sh^M: bad interpreter: No such file or directory及command not found的问题。主要原因是脚本在Windows下编写导致的编码差异,通过修改文件格式为Unix格式即可解决。

遇上了这个坑,搞了好久没搞定,参考了前辈的文章,终于搞好了,分享如下

原文地址:http://www.cnblogs.com/GordonWorld/archive/2012/03/19/2406225.html

Linux下执行.sh脚本错误:bin/sh^M: bad interpreter: No such file or directory

      原因是.sh脚本在windows系统下用记事本文件编写的。不同系统的编码格式引起的。

转行文件的编码格式:

1、确保用户对文件有读写及执行权限

     oracle@linux-106:~/RMAN/bin> chmod a+x test.sh

2、然后修改文件格式

   (1)使用vi工具

     oracle@linux-106:~/RMAN/bin> vi test.sh

    (2)利用如下命令查看文件格式 
     :set ff 或 :set fileformat 
     可以看到如下信息 
     fileformat=dos 或 fileformat=unix 
     (3) 利用如下命令修改文件格式 
     :set ff=unix 或 :set fileformat=unix 
     :wq (存盘退出)

3、最后再执行

    oracle@linux-106:~/RMAN/bin> ./test.sh

Linux下执行.sh脚本错误:command not found

      command not found这个问题一般都是像我这样的新手才会犯的,所以刚学linux的童鞋们遇到这个问题可以看看我的解释,可能会给你帮助。

      其实这个问题可能是很多原因引起的,今天我碰到原因很值得关注,一般我们在写java代码的时候定义变量都喜欢这样写” String  test  =  “ ”; ”。今天我写了一个shell脚本,在脚本里定义了一个变量,(“host = “””),结果执行的时候出现了这个command not found。我是冥思苦想啊,怎么想也想不出为什么,后来我终于发现问题的所在了就是一个空格在作怪,其实在定义shell脚本的变量时在变量名和等号之间是不允许有空格的,而我写的是test和=之间有空格,所以系统默认为,test是一个命令,所以系统找不到这个命令。切记切记,小问题有时候也会让你停滞不前的。

<think>好的,我现在要解决用户在Linux系统中执行sh文件时出现的'command not found'错误。用户之前已经提供了一些相关的引用,我需要仔细分析这些引用并结合自己的知识来给出正确的解决方案。 首先,根据用户提供的引用[3],这个问题可能是因为脚本在Windows下编辑后上传到Linux,导致换行符不一致。Windows使用\r\n,而Linux使用\n,多余的\r会被识别为字符,从而引发错误。解决方案之一是使用dos2unix工具转换文件格式,或者用sed命令删除\r。这可能是一个常见的原因,我需要优先检查这一点。 接下来,引用[2]提到环境变量的问题。如果脚本中调用的命令不在PATH环境变量中,系统也会报错'command not found'。这时候需要确认命令是否存在,以及路径是否正确。用户可能需要使用绝对路径或者修改PATH变量。 引用[1]和[5]讨论了系统是否安装了相应的软件包。如果脚本中的命令确实没有安装,比如semanage或apt,用户需要根据不同的Linux发行版安装对应的包,比如使用yum或apt-get。此外,引用[4]中的autoreconf问题也是由于缺少autoconf包导致的,所以安装依赖包也是一个解决方案。 然后,我还要考虑脚本本身的执行权限问题。如果用户没有给脚本添加可执行权限,直接执行可能会报错。这时候需要使用chmod +x来添加权限。 另外,脚本的shebang行是否正确?比如是否指定了正确的解释器路径,如#!/bin/bash或#!/usr/bin/env bash。如果路径不正确,也可能导致问题。 还需要注意脚本本身的语法错误。例如,使用了bash特有的语法但以sh运行,可能会报错。可以尝试用bash代替sh执行脚本。 总结可能的原因和解决方案: 1. 文件格式问题(Windows换行符) 2. 执行权限不足 3. 环境变量PATH未包含所需命令的路径 4. 系统未安装相关命令或软件包 5. Shebang行配置错误 6. 脚本语法错误或解释器不兼容 需要逐步检查这些可能性,给出对应的解决方法。例如,首先检查文件格式,用dos2unix转换;然后检查执行权限;接着确认命令是否存在,安装必要的软件包;检查shebang行是否正确;最后检查脚本语法。 同时,用户可能需要具体的操作步骤,比如具体的命令示例,如何转换文件格式,如何添加权限,如何安装软件包等。需要分步骤说明,确保用户能够一步步排查问题。 最后,生成相关问题,帮助用户进一步了解可能的相关问题,比如如何避免换行符问题、如何正确设置环境变量等。</think>### Linux执行.sh文件出现'command not found'解决方案 #### 一、排查与解决步骤 1. **文件格式问题(Windows换行符导致)** Windows与Linux的换行符差异是常见原因。使用以下命令转换文件格式: ```bash dos2unix your_script.sh # 需要安装dos2unix工具 ``` 或手动删除`\r`字符: ```bash sed -i 's/\r$//' your_script.sh ``` 转换后重新执行脚本[^3]。 2. **检查脚本执行权限** 确保脚本有可执行权限: ```bash chmod +x your_script.sh ``` 执行时使用完整路径或明确指定解释器: ```bash ./your_script.sh # 需在脚本所在目录 bash your_script.sh # 强制使用bash解释器 ``` 3. **验证命令是否存在** - 若报错指向**脚本内部某条命令**(如`semanage`或`apt`): - 用`find`命令查找命令路径: ```bash find / -name "command-name" 2>/dev/null # 例如:find / -name "semanage" ``` - 若找到路径但报错,需将其加入环境变量: ```bash export PATH="/found/path:$PATH" # 临时生效 ``` - 若未找到,需安装对应软件包: ```bash yum install policycoreutils-python # CentOS安装semanage apt-get install apt # Debian/Ubuntu修复apt ``` 根据发行版选择`yum`或`apt-get`[^1][^5]。 4. **检查Shebang行配置** 确保脚本首行指定正确的解释器路径: ```bash #!/bin/bash # 标准bash路径 #!/usr/bin/env bash # 动态查找bash ``` 用`which bash`验证路径是否有效。 5. **语法兼容性验证** 若脚本包含`bash`特有语法(如`[[ ]]`条件判断),使用`bash your_script.sh`代替`sh your_script.sh`执行。 #### 二、扩展验证方法 - **逐行调试脚本**: ```bash bash -x your_script.sh # 显示每条命令执行过程 ``` - **手动执行报错命令**: 在终端单独执行脚本中报错的命令,验证是否环境变量或权限问题。 #### 三、典型场景示例 | 报错类型 | 原因 | 解决方案 | |---------|------|----------| | `$'\r': command not found` | Windows换行符污染 | `dos2unix`转换文件 | | `sudo: apt: command not found` | 系统为CentOS | 改用`yum install`[^5] | | `autoreconf: command not found` | 缺少autoconf工具 | `yum install autoconf`[^4] |
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值