将参数传递给 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 指出的引用问题,我很确定你不想使用 exec
。 exec
所做的是用正在执行的命令替换当前的 shell(而不是 运行 作为子进程的命令,就像没有 exec
一样)。将括号括起来使其在子 shell 中执行该部分,从而有效地抵消了 exec
.
的影响
正如 chepner 所说,您 可能 正在考虑 eval
命令,该命令在执行命令之前执行额外的解析过程。但是 eval
是一个巨大的错误磁铁。以不安全的方式使用 eval
非常容易(请参阅 BashFAQ #48). If you need to construct a command, see BashFAQ #50 了解更好的方法。
我试图在另一个 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 指出的引用问题,我很确定你不想使用 exec
。 exec
所做的是用正在执行的命令替换当前的 shell(而不是 运行 作为子进程的命令,就像没有 exec
一样)。将括号括起来使其在子 shell 中执行该部分,从而有效地抵消了 exec
.
正如 chepner 所说,您 可能 正在考虑 eval
命令,该命令在执行命令之前执行额外的解析过程。但是 eval
是一个巨大的错误磁铁。以不安全的方式使用 eval
非常容易(请参阅 BashFAQ #48). If you need to construct a command, see BashFAQ #50 了解更好的方法。