gpt4 book ai didi

bash - 如何区分脚本中的 "command substitution"和 "subshell"?

转载 作者:行者123 更新时间:2023-11-29 09:32:55 29 4
gpt4 key购买 nike

我需要区分两种情况:( …subshell… )对比$( …command substitution… )

我已经有了以下函数,它区分在命令替换或子 shell 中运行和直接在脚本中运行。

#!/bin/bash
set -e

function setMyPid() {
myPid="$(bash -c 'echo $PPID')"
}

function echoScriptRunWay() {
local myPid
setMyPid
if [[ $myPid == $$ ]]; then
echo "function run directly in the script"
else
echo "function run from subshell or substitution"
fi
}

echoScriptRunWay
echo "$(echoScriptRunWay)"
( echoScriptRunWay; )

示例输出:

function run directly in the script
function run from subshell or substitution
function run from subshell or substitution

期望的输出

但我想更新代码以区分命令替换和子 shell。我希望它产生输出:

function run directly in the script
function run from substitution
function run from subshell

附言我需要区分这些情况,因为 Bash 在命令替换和子 shell 中运行时对内置 trap 命令有不同的行为。

附言我关心 echoScriptRunWay | cat 命令也。但这是我创建的新问题 here .

最佳答案

我认为无法可靠地测试命令是否在命令替换中运行。

您可以测试 stdout 是否与主脚本的 stdout 不同,如果不同,大胆推断它可能已被重定向。例如

samefd() {
# Test if the passed file descriptors share the same inode
perl -MPOSIX -e "exit 1 unless (fstat($1))[1] == (fstat($2))[1]"
}

exec {mainstdout}>&1

whereami() {
if ((BASHPID == $$))
then
echo "In parent shell."
elif samefd 1 $mainstdout
then
echo "In subshell."
else
echo "In command substitution (I guess so)."
fi
}

whereami
(whereami)
echo $(whereami)

关于bash - 如何区分脚本中的 "command substitution"和 "subshell"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22163099/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com