“rc=$$?;cat File1>/proc/self/fd/2;退出$$rc”com在linux shell中做什么?

“rc=$$?;cat File1>/proc/self/fd/2;退出$$rc”com在linux shell中做什么?,linux,bash,Linux,Bash,请帮助我完全理解以下命令: python3 code.py >result.txt 2>&1 || ( rc=$$? ; cat result.txt >/proc/self/fd/2 ; exit $$rc ) 在上面的代码中,我找不到什么rc=$$?和$$rc平均值 在Bash$$中,进程ID是多少?用于查找上次执行的命令的返回值。所以基本上这会获取进程ID并为其分配一个变量rc。然后看起来退出时代码等于进程ID。IMO,代码没有多大意义。如果您自己尝试在命令行上

请帮助我完全理解以下命令:

python3 code.py >result.txt 2>&1 || ( rc=$$? ; cat result.txt >/proc/self/fd/2 ; exit $$rc )

在上面的代码中,我找不到什么rc=$$?和$$rc平均值

在Bash$$中,进程ID是多少?用于查找上次执行的命令的返回值。所以基本上这会获取进程ID并为其分配一个变量rc。然后看起来退出时代码等于进程ID。

IMO,代码没有多大意义。如果您自己尝试在命令行上执行以下操作:

false; rc=$$?; echo $rc; echo $$rc
您将看到,第一个echo输出一些数字,后跟一个问号,第二个数字输出相同的数字,后跟字母rc

原因是$$是由bash维护的一个特殊变量,它保存当前进程id。虽然还有一个变量保存最近执行的命令的退出代码,但它名为$?,但在您发布的代码中从未引用过。因此,shell通常会为变量rc分配一个包含PID的字符串,并简单地添加后续的?去吧

我说一般来说,因为有一个例外,只是它不太可能发生。原因是什么?也是globbing中有效的通配符模式,并匹配任何字符。现在让我们假设shell的PID是4711,并且在当前工作目录中恰好有一个名为4711x的文件。美元?那会是4711吗?将匹配x,并且rc将以名称4711x而不是4711?结束?。如果你有两个类似的文件,4711x和4711y,结果会更有趣。试试看

退出$$rc更为奇怪。如前所述,$$rc扩展为类似于4711rc的内容,而4711rc出口完全是非法的;您将得到一条错误消息bash:exit:…:需要数值参数


由此看来,我认为无论是谁写了这段代码,从来没有调试过它,或者您在将其复制和粘贴到问题中时犯了一些错误。

这是来自Makefile还是其他什么?@Shawn it’s a linux shell Commands看起来像是包装在其他东西中,在shell将$$转换为$之前对字符串进行求值。感谢您的回答。请再次用$$rc解释该部分。Exit命令将完成该场景,它接受一个整数argunet,该整数是退出代码。在这里,它以存储在$$rc中的代码退出,这是一个进程ID。因此,出于某些原因,此函数将PID存储到变量rc,运行cat命令,并以返回PID作为退出代码来完成此操作。再次感谢。我明白了@查内尔:我不同意你的意见;但也许我在我的思路上犯了一个错误。我想请你们看一下我的答案,它给出了不同的解释,并指出其中是否有错误?我想这是来自某个Makefile。你是对的一部分,美元?是上次执行的命令的退出状态。在Makefile中,变量也被$variable解除引用。如果在Makefile中,希望将变量视为shell变量,则将$as$$转义,因此,当shell看到Makefile语句-echo$$var时,它将转换为echo$var。该行没有以代码==PID退出。我怀疑@Shawn的注释是正确的;在makefile中,$$是转义的美元符号,所以rc=$$?在makefile中,将转换为shell命令rc=$?,该命令将获取最后一个命令的退出代码并将其存储在变量rc中。类似地,exit$$rc转换为exit$?,因为它位于子shell中,因此可以有效地将退出代码重置为之前的代码。事实上,OP没有确认Shawns关于这是一个makefile的问题,并在他的评论中明确回答这将是一个正常的bash命令。此外,问题没有标记为makefile。