Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Bash';s echo语句使得无法捕获后续语句的命令输出_Python_Bash_Echo - Fatal编程技术网

Python Bash';s echo语句使得无法捕获后续语句的命令输出

Python Bash';s echo语句使得无法捕获后续语句的命令输出,python,bash,echo,Python,Bash,Echo,我(对我来说)陷入了一个非常奇怪的境地,因为echo语句会阻止我从后续命令中获取标准输出消息 这是我的test.py: print "Test Only" 这是我的测试。sh: start() { # Sample code to make sure that code within the if .. fi is executed if [ 1 -eq 1 ]; then echo "Start server" /usr/bin/python

我(对我来说)陷入了一个非常奇怪的境地,因为echo语句会阻止我从后续命令中获取标准输出消息

这是我的
test.py

print "Test Only"
这是我的
测试。sh

start() {
    # Sample code to make sure that code within the if .. fi is executed
    if [ 1 -eq 1 ]; then
        echo "Start server"
        /usr/bin/python test.py
    fi; 
}

start
Start server
执行
/bin/bash test.sh时的实际输出:

start() {
    # Sample code to make sure that code within the if .. fi is executed
    if [ 1 -eq 1 ]; then
        echo "Start server"
        /usr/bin/python test.py
    fi; 
}

start
Start server
预期产出:

Start server

Test Only
我的解决方案(变通方法):

start() {
    # Sample code to make sure that code within the if .. fi is executed
    if [ 1 -eq 1 ]; then
        MSG1="Start server"
        MSG2=`/usr/bin/python test.py`
        echo $MSG1
        echo $MSG2
    fi; 
}
如果我注释掉行
echo“Start server”
,我可以像往常一样得到消息
Test Only

我的结论是echo陈述在这里犯了一些错误。但这是我所不知道的。你能帮我理解为什么会发生这种情况吗

另一种解决方案:

start() {
    # Sample code to make sure that code within the if .. fi is executed
    if [ 1 -eq 1 ]; then
        MSG1="Start server"
        MSG2=`/usr/bin/python test.py`
        echo $MSG1
        echo $MSG2
    fi; 
}
已更新


感谢@ghoti,我已经解决了我的问题:我的代码中可能有一些不可见的字符。将它们全部消除,现在就可以工作了

要捕获命令输出,请使用反勾号。例如:

captured_output=`/usr/bin/python test.py`
echo $captured_output

要捕获命令输出,请使用反勾号。例如:

captured_output=`/usr/bin/python test.py`
echo $captured_output
对我有用

ghoti@pc $ cat echotest
#!/usr/local/bin/bash

start() {
    # Sample code to make sure that code within the if .. fi is executed
    if [ 1 -eq 1 ]; then
        echo "Start server"
        /usr/local/bin/python echotest.py
    fi
}

start

ghoti@pc $ cat echotest.py 

print "Test only"

ghoti@pc $ ./echotest
Start server
Test only
ghoti@pc $ 
你的行尾可能有问题吗?您是在运行bash的操作系统中以本机方式编辑这些文件,还是从Windows设备中复制这些文件

这就是说,我建议您在开始脚本的结构上稍微有所不同。假设您的python脚本正在后台启动一些东西,您可以执行以下操作:

#!/bin/bash

start() {
  # Sample code to make sure that code within the if .. fi is executed
  echo -n "mydaemon "
  if /usr/local/bin/python mydaemon.py; then
    echo "started"
  else
    echo "FAILED to start"
  fi
}

start
如果python脚本本身就是一个需要后台处理的守护进程,那么您无法轻松测试它的成功。你不会这样开始的。

对我来说很有效

ghoti@pc $ cat echotest
#!/usr/local/bin/bash

start() {
    # Sample code to make sure that code within the if .. fi is executed
    if [ 1 -eq 1 ]; then
        echo "Start server"
        /usr/local/bin/python echotest.py
    fi
}

start

ghoti@pc $ cat echotest.py 

print "Test only"

ghoti@pc $ ./echotest
Start server
Test only
ghoti@pc $ 
你的行尾可能有问题吗?您是在运行bash的操作系统中以本机方式编辑这些文件,还是从Windows设备中复制这些文件

这就是说,我建议您在开始脚本的结构上稍微有所不同。假设您的python脚本正在后台启动一些东西,您可以执行以下操作:

#!/bin/bash

start() {
  # Sample code to make sure that code within the if .. fi is executed
  echo -n "mydaemon "
  if /usr/local/bin/python mydaemon.py; then
    echo "started"
  else
    echo "FAILED to start"
  fi
}

start

如果python脚本本身就是一个需要后台处理的守护进程,那么您无法轻松测试它的成功。你不会这样开始的。

尝试使用“/bin/echo”而不是echo(这是你的shell的echo),看看这是否有帮助?

尝试使用“/bin/echo”而不是echo(这是你的shell的echo),看看这是否有帮助?

嗯,我创建了这两个文件,然后运行了它,得到了预期的输出
仅启动服务器\n测试
::您是否尝试颠倒这两行的顺序?“我打赌这会很有启发性的。”马金刚刚颠倒了两行的顺序,我得到了“只测试”。回声消失了:)太奇怪了。我想这不是关于bash或python,而是一个Ubuntu设置???嗯,我创建了这两个文件,然后运行它,我得到了您预期的输出
Start server\nTest Only
::您尝试过颠倒这两行的顺序吗?“我打赌这会很有启发性的。”马金刚刚颠倒了两行的顺序,我得到了“只测试”。回声消失了:)太奇怪了。我想这不是关于bash或python的,而是关于Ubuntu设置的???我在Mac10.6上编码,然后在我的Ubuntu 11服务器上测试。好的。我的工作站运行FreeBSD,我管理运行FreeBSD、Ubuntu和Debian的服务器。因此,您需要调整bash和python二进制文件的位置。。。。但如果你能更好地描述你的根本目标,那么我们就能想出更好的解决方案。从长远来看,就如何以错误的方式做事征求建议是没有用的。:)哦,对不起,如果我的问题不够清楚的话。如您所见,示例代码是我用来执行后台进程的启动脚本的一部分。在执行它之前,我打印一条消息,通知我正在启动它。然后执行后台进程。如果有任何错误,后台进程可以打印出一些消息。我希望我的bash脚本能够像往常一样捕获它。但它没有得到它。我截断bash文件,从头开始编写代码,删除文件中可能意外出现的所有不可见字符。现在它是一种魅力。Thanks@pcdinh你需要点击复选标记并将其变为绿色,这样ghoti就可以获得代表,帮助你解决问题。我在Mac 10.6上进行编码,然后在我的Ubuntu 11服务器上进行测试。好的。我的工作站运行FreeBSD,我管理运行FreeBSD、Ubuntu和Debian的服务器。因此,您需要调整bash和python二进制文件的位置。。。。但如果你能更好地描述你的根本目标,那么我们就能想出更好的解决方案。从长远来看,就如何以错误的方式做事征求建议是没有用的。:)哦,对不起,如果我的问题不够清楚的话。如您所见,示例代码是我用来执行后台进程的启动脚本的一部分。在执行它之前,我打印一条消息,通知我正在启动它。然后执行后台进程。如果有任何错误,后台进程可以打印出一些消息。我希望我的bash脚本能够像往常一样捕获它。但它没有得到它。我截断bash文件,从头开始编写代码,删除文件中可能意外出现的所有不可见字符。现在它是一种魅力。Thanks@pcdinh您需要单击复选标记并将其变为绿色,以便ghoti获得代表,帮助您解决问题。