将参数传递给 exec 调用的脚本,产生不希望的结果

Passing argument to script invoked by exec producing undesired result

我试图在另一个 shell 脚本中通过 exec 将参数传递给 shell 脚本。但是,我收到一条错误消息,指出路径中不存在该脚本 - 但事实并非如此。

$ ./run_script.sh 
$ blob has just been executed.
$ ./run_script.sh: line 8: /home/s37syed/blob.sh test: No such file or directory

出于某种原因,它将整个执行视为脚本的一个完整绝对路径 - 它没有将字符串读取为 blob.sh 的参数。

这是正在执行的脚本。

#!/bin/bash
#run_script.sh
blobPID="$(pgrep "blob.sh")"
if [[ -z "$blobPID" ]]
then
    echo "blob has just been executed."
    #execs as absolute path - carg not read at all
    ( exec "/home/s37syed/blob.sh test" )
    #this works fine, as exepcted
    #( exec "/home/s37syed/blob.sh" )
else
    echo "blob is currently running with pid $blobPID"
    ps $blobPID
fi

并且脚本被 run_script.sh 调用,没有做太多,只是模拟了一个很长的 process/task:

#!/bin/bash
#blob.sh
i=0
carg=""
if [[ -z "$carg" ]]
then
    echo "nothing entered"
else
    echo "command line arg entered: $carg"
fi
while [ $i -lt 100000 ];
    do
    echo "blob is currently running" >> test.txt
    let i=i+1
done

这是我使用的 Bash 版本:

$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)    

任何 advice/comments/help 为什么会发生这种情况将不胜感激!

提前致谢,

s37syed

替换

exec "/home/s37syed/blob.sh test"

(尝试不带参数执行名为“/home/s37syed/blob.sh test”的命令)

来自

exec /home/s37syed/blob.sh test

(使用单个参数 "test" 执行“/home/s37/syed/blob.sh”)。

除了 Cyrus 指出的引用问题,我很确定你不想使用 execexec 所做的是用正在执行的命令替换当前的 shell(而不是 运行 作为子进程的命令,就像没有 exec 一样)。将括号括起来使其在子 shell 中执行该部分,从而有效地抵消了 exec.

的影响

正如 chepner 所说,您 可能 正在考虑 eval 命令,该命令在执行命令之前执行额外的解析过程。但是 eval 是一个巨大的错误磁铁。以不安全的方式使用 eval 非常容易(请参阅 BashFAQ #48). If you need to construct a command, see BashFAQ #50 了解更好的方法。