Bash 2个相同的函数,但有一个挂起

Bash 2个相同的函数,但有一个挂起,bash,Bash,我不明白为什么这些函数中的一个运行得很好(状态正常),但另一个却挂断了,根本没有输出。[状态记录] pidfile和recfile都是/var/run/中各自PID文件的有效路径,并且都只包含一个PID编号,没有换行符或其他不可打印的字符 status-up() { if [ -f ${pidfile} ]; then if ps p $(cat ${pidfile}) >> /dev/null; then printf "Upload

我不明白为什么这些函数中的一个运行得很好(状态正常),但另一个却挂断了,根本没有输出。[状态记录]

pidfile
recfile
都是
/var/run/
中各自PID文件的有效路径,并且都只包含一个PID编号,没有换行符或其他不可打印的字符

status-up() {
    if [ -f ${pidfile} ]; then
        if ps p $(cat ${pidfile}) >> /dev/null; then
            printf "Upload running as PID %s\n" $(cat ${pidfile})
            return
        fi
    fi
    echo "Upload is not running"
}

status-rec() {
    if [ -f ${recfile} ]; then
        if ps p $(cat ${recfile}) >> /dev/null; then
            printf "Receive running as PID %s\n" $(cat ${recfile})
            return
        fi
    fi
    echo "Receive is not running"
}

cat
在没有输入的情况下挂起,其他许多程序也是如此。其中一条路径很可能是空的,因为您可以通过
if
语句:

$ if [ -f ]; then echo "foo"; fi  
foo

进入区块后,挂断呼叫
cat
。正如@ruakh所指出的,您应该让它双引号引用变量。

$pidfile
$recfile
具有相同的值时,一个有效,另一个挂起吗?否则,这似乎是一个合理的原因,为什么一个人工作,一个人不工作:他们有不同的输入。在这种情况下,试着运行
status up
$pidfile
设置为一个路径,然后设置为另一个路径,然后使用
status rec
将其设置为相同的路径,您将看到是函数出了问题还是输入出了问题。@DavidZaslavsky:我真的不理解您的评论。除了使用的文件外,这两个函数在字面上是相同的;我不认为有任何问题,但如果他们使用相同的文件,他们会表现相同。问题是为什么一个文件会导致其函数挂起,而另一个则不会。另外,请注意,如果没有输入,cat会挂起,其他许多程序也是如此。你的一个路径很可能是空的。要添加到鲁本斯的注释:请注意,如果
[…]
只有一个参数,它会检查该参数是否为非空;因此,如果
$recfile
为空或未设置,则
[-f${recfile}]
[-f]
(因为
-f
为非空字符串)。这是您应该始终将参数扩展用双引号括起来的一个原因:
[-f“$recfile”]
不会有这种错误行为。@ruakh我的评论质疑OP的明显假设(基于问题的编写方式),即行为的差异是由于函数本身的原因,而不是输入。是否有可能其中一个文件正在使用?就是这样。显然,当我写这个函数的时候,我是暂时兴奋的。变量是
${recpid}
,而不是
${recfile}
@Sammitch-Haha!我们有时都会兴奋!我刚刚发现,我已经开发了将近一年的应用程序中的最后一个bug是由于没有刷新文件描述符造成的(:这是一个分布式应用程序,让事情变得更有趣^^