![对 pi3B+ 进行 bash 拉伸;用于 fork 'program &' 的 shell 脚本 --bash 找不到文件。它就在那里](https://linux22.com/image/193773/%E5%AF%B9%20pi3B%2B%20%E8%BF%9B%E8%A1%8C%20bash%20%E6%8B%89%E4%BC%B8%EF%BC%9B%E7%94%A8%E4%BA%8E%20fork%20'program%20%26'%20%E7%9A%84%20shell%20%E8%84%9A%E6%9C%AC%20--bash%20%E6%89%BE%E4%B8%8D%E5%88%B0%E6%96%87%E4%BB%B6%E3%80%82%E5%AE%83%E5%B0%B1%E5%9C%A8%E9%82%A3%E9%87%8C.png)
尝试过带/不带 ' 和 & 的变体,拼写完整路径,添加到 $PATH。该脚本似乎无法找到 hyperping,尽管它与调用它的脚本位于同一目录中。以用户 pi 身份执行。拔我的头发!!脚本中的实际行
if [ $(/usr/bin/pgrep -c hyperping) -eq 0 ]; then './hyperping &'; fi
“hyperping”在 PATH 中 [通过 $PATH 验证,也通过删除 & 验证]
***pi@pi20:~/tests $ ls -lt hyperping
-rwxr-xr-x 1 pi pi 692 Jul 30 13:10 hyperping***
“hyperping”独立运行正常。
带有“set -xv”的 bash 输出
***/++ /usr/bin/pgrep -c hyperping
+ '[' 0 -eq 0 ']'
+ '/home/pi/tests/hyperping &'
./at7PM: line 33: /home/pi/tests/hyperping &: *No such file or
directory*/****
答案1
您没有运行hyperping
,您正在尝试运行一个名为hyperping &
(字面意思是带有空格和&
)的命令。发生这种情况是因为您不必要地将命令引用./hyperping &
为'./hyperping &'
.
我假设你打算做类似的事情
if ! pgrep hyperping >/dev/null; then
hyperping &
fi
如果您pgrep
可以-q
选择使其安静,那么您可以放弃>/dev/null
:
if ! pgrep -q hyperping; then
hyperping &
fi
该pgrep
命令的行为有点像grep
,如果它成功找到您正在查找的内容,则它以零退出状态退出,否则以非零退出状态退出。我们可以使用如上所示的方法来避免解析实际的输出命令的线索以获取有关是否发现某些内容的线索。您可能会读if ! pgrep somecommand; then ...; fi
为“如果没有名为somecommand
运行的命令,则......”。
答案2
SELECT 没有损坏!
尝试过带/不带 ' 和 & 的变体,拼写完整路径,添加到 $PATH。
Kusalamanda 已经指出了在命令周围随机添加引号、包含空格和与号的错误 - 不要这样做。有太多疯狂的想法,无法全部测试。
bash 和类似 shell 中的引号与大多数其他编程语言不同。它们的主要目的是保留空格和其他空白字符。不幸的是,许多开发人员下意识地从其他语言导入他们的语法习惯,并且表现得好像每个字符串都需要引号。
该脚本似乎无法找到 hyperping,尽管它与调用它的脚本位于同一目录中。
这绝对是无关紧要的,也许是第二个错误,干扰了你的第一个错误。
找到可执行文件是因为它位于路径中,然后您必须在不提供路径的情况下调用它。
或者它不在路径中,那么您必须提供相对路径(如./some/where/script.sh)或绝对路径。相对路径被认为是相对于调用者(您在 shell 中)调用它们的位置,而不是相对于间接调用它们的另一个脚本/程序。
如果你的脚本在路径中,不要用像 这样的相对路径来调用它./hyperping
,而只是hyperping
,因为如果用相对路径调用它,就不会使用路径来查找它,而是取决于位置,从它被调用的地方,这通常是一个坏主意。