3

我需要区分两种情况:( ...subshel​​l... ) vs $( ...命令替换...)

我已经有了以下函数,它可以区分在命令替换或子 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

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

PPS 我也关心echoScriptRunWay | cat命令。但这对我来说是我在这里创建的新问题。

4

1 回答 1

0

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

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

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)
于 2014-03-04T20:58:28.657 回答