linux shell $? shell在拖车叉进程中执行时,在scp命令后不为0,为什么?

时间:2020-02-10 04:55:34

标签: python bash shell scp

shell脚本:

#!/bin/bash
scp -q /local/opt/file_test remote_host:~/ 2>&1
echo $?
exit 0

python代码:

import subprocess
from multiprocessing import Process
import os
import signal
import sys
from multiprocessing import set_start_method

def _detach_with_context(executor):
   # 放在context外面, 减少开销
   os.setsid()

   signal.signal(signal.SIGCHLD, signal.SIG_IGN)

   pid = os.fork()
   if pid > 0:
       sys.exit(0)

   try:
       if pid < 0:
           sys.exit(0)

       # 执行任务
       executor()
   except Exception as ex:
       pass
   finally:
       sys.exit(0)


def detach_autosql_execute(executor):
   try:
       p = Process(target=_detach_with_context, args=(executor,))

       p.start()
       p.join()
   except Exception as ex:
       executor.failure(f'create daemon process error: {ex}')


def execute():
   command='sh ./test.sh'

   p = subprocess.Popen(
       command.encode('utf-8'),
       stdout=subprocess.PIPE,
       stderr=subprocess.PIPE,
       shell=True,
       encoding='UTF-8'
   )
   print(''.join(p.stdout.readlines()))


if __name__ == '__main__':
   set_start_method('spawn')
   detach_autosql_execute(execute)

本地主机和远程主机'remote_host'是ssh无密码登录。 “回声$?”正常为0,但shell脚本回显$?是1 当我仅通过命令执行shell脚本时,回显$?是0 当我在一个fork进程中执行shell脚本时,回显$?是0 但是当我在两个fork过程中执行shell脚本时,echo $ ??是1

为什么?

1 个答案:

答案 0 :(得分:0)

您可以在脚本~/中使用它来表示您的主目录,但这是一项bash功能。但是,您使用sh ./test.sh运行脚本,这意味着它是由POSIX shell执行的。我建议您通过bash ./test.sh调用脚本,或通过$HOME而不是~在脚本中指定主目录。

更新:为什么使用sh运行波浪号扩展的脚本(基于其#!行)来运行bash仍然不是一个好主意就像@tripleee在他们的评论中指出的那样,应该不会造成任何不同。