【问题标题】:Bash script lost shebang path after instantiate functionBash 脚本在实例化函数后丢失了 shebang 路径
【发布时间】:2017-08-18 18:59:01
【问题描述】:

我正在编写一个带有迭代菜单的脚本来运行命令行。但是,在创建迭代菜单后,当我想运行命令时出现错误。 错误是 [COMMAND]No such file or directory linux。

#!/bin/bash
ATESTS=("TEST NAME 1" "TESTE NAME 2")
PATH=("test1.xml" "text2.xml")

menu () {
   for i in ${!ATESTS[@]}; do
       printf "%3d%s) %s\n" $((i+1)) "${OPT[i]:- }" "${ATESTS[i]}"
   done
   [[ "$msg" ]] &&  echo "$msg"; :
}

prompt="Check an ATEST (again to uncheck, ENTER when done): "

while menu && read -rp "$prompt" num && [[ "$num" ]]; do
    /usr/bin/clear;
    [[ "$num" != *[![:digit:]]* ]] &&
    (( num > 0 && num <= ${#ATESTS[@]} )) ||
    { msg="Invalid ATEST: $num"; continue; }
    ((num--)); msg="${ATESTS[num]} was ${OPT[num]:+un}checked"
    [[ "${OPT[num]}" ]] && OPT[num]="" || OPT[num]="+"
done

for i in ${!ATESTS[@]}; do
    [[ "${OPT[i]}" ]] && { printf "%s " "${ATESTS[i]}"; msg=""; }
done

echo "$msg"

for i in ${!ATESTS[@]}; do
   if [[ "${OPT[i]}" ]] && [[ $PWD = /repo/$USER/program ]]; then
       find . -iname ${PATH[i]} -exec cat {} \;
   fi
done

我想找到一个 *.xml 文件,然后使用已经存在且属于 /usr/bin 的脚本执行。但是 find 命令不执行,本例中的 cat 命令也不执行,出现以下错误([COMMAND]No such file or directory linux.)

如果我尝试在函数之前运行一个 bash 命令,命令执行没有任何问题,但在函数之后命令失败。

我为在 /repo/$USER/program 中运行的脚本创建了一个别名,但不包含脚本的路径。

【问题讨论】:

    标签: linux bash shell sh shebang


    【解决方案1】:

    问题与shebang或功能无关。问题是您正在使用变量$PATH。该变量告诉系统在哪些目录中搜索可执行命令,因此当您将其设置为数组时...它将开始在${PATH[0]} 指定的位置(即“test1.xml”)中查找命令,它甚至不是一个目录,更不用说包含您需要的所有可执行文件的目录了。

    解决方案:不要将变量名PATH 用于搜索命令的目录列表以外的任何内容。事实上,由于这是大量具有特殊功能的全大写变量之一,因此最好在脚本中使用小写(或混合大小写)变量,以避免出现此类奇怪的冲突。

    顺便说一句,我不知道脚本的其余部分是否有意义;您使用短路布尔值进行条件执行(例如this &amp;&amp; that || do something)使得很难遵循逻辑。我强烈建议使用if 块进行条件执行(就像你在最后的for 循环中所做的那样);它们让我们更容易知道发生了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多