【问题标题】:Getting "command not found" error in bash script在 bash 脚本中出现“找不到命令”错误
【发布时间】:2022-01-16 01:57:29
【问题描述】:

我编写了一个 bash 脚本,它根据输入参数获取三个路径,然后获取路径中的图像名/文件名。

类似:
我提供:

AA=/home/user

然后它使用find命令来获取
/home/user/dir2/images/dir/tellmeimage1fun.bin

最后我必须得到 tellmeimage1fun.bin 作为输出。

脚本:

#!/bin/bash  

echo "arg0 n/k/d"  

AA=$1  
CC=$3  

PATH1="`find $AA/dir2/images/dir/ -name *image1*.bin`"  
PATH2="`find $AA/dir2/images/dir/ -name *bimage2*.bin`"  
PATH3="`find $AA/dir2/images/dir/ -name *cimage3*.bin`"  

if [ $CC = "n" ] ; then  
    PATH=$PATH1  
elif [ $CC = "k" ] ; then  
    PATH=$PATH2  
else  
    PATH=$PATH3  
fi  

#Getting filename name from path:  
IMG="`ls $PATH | cut -d "/" -f6`"

OUTPUT:  
/users/prasapat/bin/sl5: line 22: ls: command not found  
/users/prasapat/bin/sl5: line 22: cut: command not found  

如果我给出 ls 的完整路径并剪切它们,它们就可以工作。但我不想对脚本中的所有命令都这样做。如果我删除最后一行并回显 PATH 变量,那就完全没问题了。只有在添加最后一个命令后,我才看到问题。

我做错了什么?

【问题讨论】:

    标签: bash


    【解决方案1】:

    问题在于,如果您在调用时不使用完整路径,那么您正在重新定义 bash 查找二进制文件的 PATH 变量。

    您应该将 bash 脚本中的 PATH 更改为 MYPATH 或类似的东西,这样它就不会与已经存在的环境变量混淆。

    如果您不知道 PATH 变量的用途,可以查看 wikipedia's article

    【讨论】:

    • 更好的解决方案是永远不要对任何私有变量使用大写字母。大写为系统变量保留;使用小写字母可确保您不会意外地使用您尝试的下一个变量名破坏某些其他系统变量。另请参阅stackoverflow.com/questions/673055/…
    【解决方案2】:

    我遇到了这个问题,结果发现使用 Notepad++ 编辑 bash 脚本是添加 DOS 行结尾而不是 UNIX 行结尾。在 Linux 环境中运行脚本会导致抛出“找不到命令”错误。

    通过像这样运行我的脚本来诊断问题:

    bash -x testscript.sh
    

    这将转储任何编译器输出。抛出的错误消息是:

    bash -x testscript.sh
    + $'\r'
    : command not found 2:
    'estscript.sh: line 3: syntax error near unexpected token `{
    

    我通过编辑 -> EOL 转换 -> UNIX 将 Notepad++ 中的行尾格式更改为 UNIX 而不是 DOS,从而解决了这个问题。

    【讨论】:

    【解决方案3】:

    $PATH 是一个特殊的环境变量,它包含一个目录列表,当您键入命令(例如 findls)时,您的 shell(在本例中为 bash)应该查看的目录列表。试试 @ 987654324@ 在脚本或 shell 中以了解它的外观(您通常会在此处列出 /bin/usr/bin/usr/local/bin,也许更多。)

    由于您实际上不需要在此特定脚本中重新定义此变量,因此您应该使用 $PATH 以外的其他名称。

    【讨论】:

      【解决方案4】:

      $PATH 是一个预定义变量,它提供了在查找可执行文件时要搜索的目录。为你的脚本选择一个不同的变量名,你会没事的。

      【讨论】:

        【解决方案5】:

        使用与PATH 不同的变量名。 $PATH 是环境变量,它告诉你的 shell 在哪里寻找可执行文件(例如,你可以运行 ls 而不是 /bin/ls)。

        【讨论】:

          【解决方案6】:

          您使用的是特殊的PATH,用于定位命令,这就是无法解析ls 的原因。使用PATH以外的任何名称

          if [ $CC = "n" ] ; then  
              MY_PATH=$PATH1  
          elif [ $CC = "k" ] ; then  
              MY_PATH=$PATH2  
          else  
              MY_PATH=$PATH3  
          fi 
          
          export MY_PATH
          
          IMG="`ls $MY_PATH | cut -d "/" -f6`"
          

          【讨论】:

            猜你喜欢
            • 2021-07-08
            • 1970-01-01
            • 2015-07-01
            • 1970-01-01
            • 2015-08-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多