首页 文章

获取导出函数的调用者脚本

提问于
浏览
1

我有一个脚本/usr/bin/test.sh看起来像这样:

test_func()
{
    echo "callertest 1:"
    cat /proc/$PPID/cmdline | tr '\0' ' '
    echo "callertest 2:"
    ps aux | grep $PPID
}

export -f test_func
bash -c test_func

因为“/ usr / bin”在$ PATH中,所以我用“test.sh”调用脚本 . 该函数应该回显脚本的名称或更好的完整路径,但我没有比得到“bash”更进一步 . 对于放在$ PATH中的脚本来说似乎是一个问题 .

2 回答

  • 0

    而不是使用函数,将代码放在脚本中:

    #!/bin/bash
    
    echo "callertest 1:"
    cat /proc/$PPID/cmdline | tr '\0' ' '
    echo "callertest 2:"
    ps aux | grep $PPID
    

    确保它是可执行的:

    chmod +x test_script.bash
    

    然后用 xargs 执行它:

    seq 10 | xargs -n 1 -P $(nproc) ./test_script.bash
    
  • 0

    这应涵盖所有情况:

    get_scriptname()
    {
        SCRIPTFILE=$(readlink -e -- "${0}" 2>/dev/null)
        until [ -e "${SCRIPTFILE}" ] || [ "$_PPID" = "0" ] ; do
            _PPID=$(awk '{print $4}' /proc/${_PPID:-$$}/stat 2>/dev/null)
            CMDLINE=$(awk -F '\0' '{print $2}' /proc/${_PPID}/cmdline 2>/dev/null)
            READLINK=$(readlink -e -- "${CMDLINE}" 2>/dev/null)
            WHICH=$(which -- "${CMDLINE}" 2>/dev/null)
            SCRIPTFILE=${READLINK:-${WHICH}}
        done
    }
    
    test_func()
    {
        get_scriptname
        echo "${SCRIPTFILE}: $1"
    }
    
    export -f test_func get_scriptname
    bash -c "test_func param0"
    echo -e "param1\nparam2\nparam3" | xargs -n 1 -i bash -c "test_func {}"
    

相关问题