Python linux外壳$?当shell在tow fork进程中执行时,scp命令后不是0,为什么?

Python linux外壳$?当shell在tow fork进程中执行时,scp命令后不是0,为什么?,python,bash,shell,scp,Python,Bash,Shell,Scp,shell脚本: #/bin/bash scp-q/local/opt/file\u test remote\u主机:~/2>&1 回声$? 出口0 python代码: 导入子流程 从多处理导入进程 导入操作系统 输入信号 导入系统 从多处理导入集\u开始\u方法 def_detach_与_上下文(执行者): # 放在上下文外面, 减少开销 os.setsid() 信号。信号(signal.SIGCHLD,signal.SIG_IGN) pid=os.fork() 如果pid>0: 系统出口(

shell脚本:

#/bin/bash
scp-q/local/opt/file\u test remote\u主机:~/2>&1
回声$?
出口0
python代码:

导入子流程
从多处理导入进程
导入操作系统
输入信号
导入系统
从多处理导入集\u开始\u方法
def_detach_与_上下文(执行者):
# 放在上下文外面, 减少开销
os.setsid()
信号。信号(signal.SIGCHLD,signal.SIG_IGN)
pid=os.fork()
如果pid>0:
系统出口(0)
尝试:
如果pid<0:
系统出口(0)
# 执行任务
遗嘱执行人()
例外情况除外,例如:
通过
最后:
系统出口(0)
def detach_autosql_execute(执行器):
尝试:
p=Process(target=\u detach\u与\u上下文,args=(executor,))
p、 开始()
p、 加入
例外情况除外,例如:
executor.failure(f'create daemon process error:{ex}')
def execute():
command='sh./test.sh'
p=子进程Popen(
command.encode('utf-8'),
stdout=子流程.PIPE,
stderr=子流程.PIPE,
shell=True,
编码='UTF-8'
)
打印(“”.join(p.stdout.readlines())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
设置启动方法('spawn')
分离自动SQL执行(执行)
本地主机和远程主机“remote_host”是ssh无密码登录。 “echo$?”正常值为0,但shell脚本echo$?是1,, 当我仅通过命令执行shell脚本时,echo$?是0 当我在一个fork进程中执行shell脚本时,echo$?是0 但是当我在两个fork进程中执行shell脚本时,echo$?是1


为什么?

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


更新:为什么使用
sh
运行一个用于bash的脚本(基于它的#!行)仍然不是一个好主意,正如@tripleee在他们的评论中指出的那样,您对tilde扩展的使用不应该造成任何差异。

您不清楚自己在问什么。当
scp
失败时,您会遇到哪个错误?哪个版本的脚本会产生哪个结果?我不确定,但是,由于1个fork进程运行正常,2个fork进程失败,我认为当您执行两个进程时,第二个进程会发现资源被第一个进程锁定。如果您试图理解为什么
scp
说有问题,那么为什么要指定
-q
(安静模式)?这对我来说似乎适得其反…,尽管OP的
sh
当然可能是POSIX之前的。无论如何,在
scp
目标中使用它意味着它是由
scp
评估的(尝试
echo foo:~/bar
并观察外壳不执行任何扩展)。谢谢你指出。我应该检查一下。我是和老伯恩·谢尔一起长大的,我不知道POSIX也祝福了~的。请注意,如果你不再相信你的答案是正确的,你可以删除它。@ruakh:我知道,但我想这是否为时尚早。虽然我的解释肯定是错误的,但唯一奇怪的是OP的问题是,他正在用sh运行一个bash脚本。也许他没有发布完整的脚本?而且,我认为删除答案也会使错误答案的评论无法访问;但至少tripleee的评论是有价值的,不应该消失。