/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: 没有那个文件或目录
以下是我验证过的几件事,
- 是的,不错的可执行文件在 /usr/bin/nice
中退出
- 我的 $PATH 还包含 /usr/bin/
- 检查过我是否缺少任何库,我认为我没有。
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
的值,而 然后 设置 IFS
而 echo
打印结果(所以设置没有实际效果)。
字符串中的那些字符可能不是正常的 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!)。为 NICE
和 NOHUP
“命令”定义函数而不是变量可能会更好。像这样:
nice_val() {
/usr/bin/nice -n -19 "$@"
}
我在这样的 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: 没有那个文件或目录
以下是我验证过的几件事,
- 是的,不错的可执行文件在 /usr/bin/nice 中退出
- 我的 $PATH 还包含 /usr/bin/
- 检查过我是否缺少任何库,我认为我没有。
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
的值,而 然后 设置IFS
而echo
打印结果(所以设置没有实际效果)。字符串中的那些字符可能不是正常的 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!)。为
NICE
和NOHUP
“命令”定义函数而不是变量可能会更好。像这样:nice_val() { /usr/bin/nice -n -19 "$@" }