2016-08-13 33 views
0

我试图通过exec将参数传递给shell脚本,在另一个shell脚本中。但是,我得到一个错误,该脚本不存在于路径中 - 但事实并非如此。将参数传递给由exec调用的脚本产生不良结果

$ ./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被调用,而不是做多,只是模拟一个漫长的过程/任务:

#!/bin/bash 
#blob.sh 
i=0 
carg="$1" 
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)  

任何意见/意见/帮助为什么发生这种情况将不胜感激!

由于提前,

s37syed

+2

它看起来像你是'exec'与'eval'混淆。 – chepner

+0

*为什么*你在这里使用'exec'或'eval'?我没有看到任何一个合法的目的。 –

回答

2

除了引用问题,赛勒斯指出,我敢肯定你不想使用execexec的作用是用正在执行的命令替换当前shell(而不是将该命令作为子进程运行,因为它没有exec)。放置括号可以使其在子shell中执行该部分,从而有效地抵消exec的影响。

正如chepner所说,你可能想到eval命令,该命令在执行命令之前执行额外的解析过程。但eval是一个巨大的臭虫磁铁。以不安全的方式使用eval非常容易(请参阅BashFAQ #48)。如果您需要构建命令,请参阅BashFAQ #50以获取更好的方法。

+0

我有意使用exec这种方式 - 我需要找出正在运行的进程的PID,并确保在它已经运行时不启动blob.sh。我实际上想出了一个替代解决方案,我开始这个过程并使用$!保存新进程的PID,并确保进程没有运行(如果文件中的PID不存在)。 感谢您的解释,我会进一步阅读BashFAQ。 – s37syed

3

替换

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

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

by

exec /home/s37syed/blob.sh test 

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

+0

这确实在验证后才起作用。我假设我无法检索“子”脚本的PID,因此我在一个子shell中执行了该命令。我很感谢赛勒斯的帮助! – s37syed