/usr/bin/nice -n -19: 没有这样的文件或目录,但 nice 存在

/usr/bin/nice -n -19: No such file or directory but nice exists

我在这样的 bash 脚本中有一个小函数,

func()
{
    
    local nice_val="$NICE -n -19"
    
    /* bunch of if/else statements and some loops*/
    
    $nice_val $NOHUP a.out >> $log_file 2>&1 &
}

当我尝试执行这个文件时,我看到了这个错误。 /root/bringup.sh: 第 323 行:/usr/bin/nice -n -19: 没有那个文件或目录

以下是我验证过的几件事,

  1. 是的,不错的可执行文件在 /usr/bin/nice
  2. 中退出
  3. 我的 $PATH 还包含 /usr/bin/
  4. 检查过我是否缺少任何库,我认为我没有。
root@dg:~# ldd /usr/bin/nice
        linux-vdso.so.1 (0x00007ffdc4dab000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f749b9bf000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f749bf67000)
root@dg:~# find / -name libc.so.6
/lib/x86_64-linux-gnu/libc.so.6

注意:1.I'运行将所有内容都作为 root 和 $NICE,$NOHUP 是一些 shell 变量,这些变量在脚本的开头。 2.This 脚本被另一个脚本调用 3.I 如果我的“nice”被移动但没有帮助,请在线阅读清除哈希 (hash -r) 可能会有所帮助。 4. 所有这些脚本都 运行 在容器内。但我想这应该不会有任何影响。

在上面的代码片段中,如果我将 $nice_val 替换为“nice”的完整路径,它就可以工作。 IE /usr/bin/nice -n -19 $NOHUP a.out >> $log_file 2>&1 & ---> 令人惊讶的是这有效。 哦,我检查了我是否有任何额外的空间,/r。我什么都没看到。

我真的想不通到底出了什么问题。非常感谢对这个问题的任何见解。非常感谢。

更新: 这是我的代码的问题: (这是重现问题的压缩虚拟代码) 文件 1:bringup.sh

#! /bin/bash

declare -r NOHUP="/usr/bin/nohup"
declare -r NICE="/usr/bin/nice"
declare -r CAT="/bin/cat"

log_file="/root/affinity/dumplog"
values_file="/root/affinity/values"
niceval="$NICE -n -10"

get_indexed_val()
{
    local val=
    if [ -e $values_file ]; then
        local val_str=$($CAT $values_file)
        IFS=','
        read -ra cpu_array <<< "$val_str"
        #
        # If you uncomment the below line(setting back the IFS to 'space', code works fine.
        #
        #IFS=' '
        return ${cpu_array[$val]}
    fi
    return 0
}

index=0
for (( index=0; index < 4; index++ )); do
    get_indexed_val $index
    myval=$?
    $niceval $NOHUP /root/affinity/loop.sh $myval >> $log_file 2>&1 &
done

文件 2:loop.sh

#! /bin/bash

i=0
number=
while [ $i -lt $number  ]; do
        sleep 0.1
done

文件 3:值

140,150,160,170

如果不重置 IFS,您将看到的错误消息。

./bringup.sh: line 28: /usr/bin/nice -n -10: No such file or directory
./bringup.sh: line 28: /usr/bin/nice -n -10: No such file or directory
./bringup.sh: line 28: /usr/bin/nice -n -10: No such file or directory
./bringup.sh: line 28: /usr/bin/nice -n -10: No such file or directory

谢谢大家。非常感谢。

您收到的错误消息 /root/bringup.sh: line 323: /usr/bin/nice -n -19: No such file or directory 表明“ -n -19”被视为文件名的一部分,而不是参数。由于 /usr/bin 目录中没有名为“nice -n -19”的文件,因此您会收到找不到文件的错误消息。

通常,当你扩展一个包含spaces(或其他白色space)但周围没有double-quotes的变量时,变量的值将被拆分成“文字”基于白色space。在这种情况下,我希望它被分成“/usr/bin/nice”、“-n”和“-19”,因此第一个将被视为 command/filename 到 运行 和其他作为参数。但在这种情况下,分裂显然没有发生。我看到了几种可能的解释:

  • IFS 已更改。 IFS 变量定义哪些字符被认为是白色 space 用于 word-splitting 目的;如果它不包含 space 字符,那就可以解释为什么该值不能正常拆分。

    更改IFS会产生很多像这样的奇怪效果,所以如果您出于某种原因需要更改它,最好尽快将其设置回正常状态。

    有时通过将设置设置为该命令的前缀,仅将 IFS 更改应用于单个命令就足够了。例如:

     IFS=, read -r field1 field2 field3
    

    将以逗号分隔字段,但由于 IFS 设置专门适用于该命令,因此之后没有必要将其设置回去。但这并不总是如您所愿,因为该设置适用于该命令的 执行 ,而不是其参数的解析方式。例如,IFS=, echo $var 将在正常白色 space 上拆分 $var 的值,而 然后 设置 IFSecho打印结果(所以设置没有实际效果)。

  • 字符串中的那些字符可能不是正常的 spaces,而是 similar-looking-but-different,例如 non-breaking spaces。您可以通过对文本进行十六进制转储来检查。这是一个例子(^^s 是我加的):

     $ echo "/usr/bin/nice -n -19" | xxd    # These are normal spaces
     00000000: 2f75 7372 2f62 696e 2f6e 6963 6520 2d6e  /usr/bin/nice -n
                                               ^^                    ^
     00000010: 202d 3139 0a                              -19.
               ^^                                       ^
     $ echo "/usr/bin/nice -n -19" | xxd    # These are non-breaking spaces
     00000000: 2f75 7372 2f62 696e 2f6e 6963 65c2 a02d  /usr/bin/nice..-
                                               ^^ ^^                 ^^
     00000010: 6ec2 a02d 3139 0a                        n..-19.
                 ^^ ^^                                   ^^
    

    看到第二个转储如何在十六进制中使用“c2 a0”而不是“20”,以及右侧文本中的“..”而不是“”吗?这些是 UTF-8 编码的 non-breaking spaces。尝试将 echo "$nice_val" | xxd 放入您的脚本中,然后查看它打印的内容。

  • 该脚本在 zsh 下 运行ning(而不是 bash)。默认情况下,zsh 不会执行 word-splitting(因为它实际上会导致很多错误,并且通常有更好的方法来完成所需的操作)。

  • 您实际上在变量引用周围有 double-quotes,只是没有将它们包括在问题中。如果这是实际命令:

     "$nice_val" $NOHUP a.out >> $log_file 2>&1 &
    

    ...那么错误消息就很有意义了。请注意,通常情况下,将 double-quotes 放在变量引用周围是一个好主意(以避免 word-splitting 文件名通配可能导致的问题),但在这种情况下,您需要依靠它。

    但是将命令存储在像这样的变量中无论如何都有些不可靠(参见 BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!)。为 NICENOHUP “命令”定义函数而不是变量可能会更好。像这样:

     nice_val() {
         /usr/bin/nice -n -19 "$@"
     }