获取导出函数的调用者脚本
get the caller script of an exported function
我有一个脚本 /usr/bin/test.sh,看起来像这样:
test_func()
{
echo "callertest 1:"
cat /proc/$PPID/cmdline | tr '[=10=]' ' '
echo "callertest 2:"
ps aux | grep $PPID
}
export -f test_func
bash -c test_func
因为“/usr/bin”在 $PATH 中,我用 "test.sh" 调用脚本。该函数应该回显脚本的名称或更好的完整路径,但我除了获得 "bash" 之外没有得到任何进一步的信息。似乎是放置在 $PATH 中的脚本的问题。
不要使用函数,而是将代码放在脚本中:
#!/bin/bash
echo "callertest 1:"
cat /proc/$PPID/cmdline | tr '[=10=]' ' '
echo "callertest 2:"
ps aux | grep $PPID
确保它是可执行的:
chmod +x test_script.bash
然后用xargs
执行:
seq 10 | xargs -n 1 -P $(nproc) ./test_script.bash
这应该涵盖所有情况:
get_scriptname()
{
SCRIPTFILE=$(readlink -e -- "[=10=]" 2>/dev/null)
until [ -e "${SCRIPTFILE}" ] || [ "$_PPID" = "0" ] ; do
_PPID=$(awk '{print }' /proc/${_PPID:-$$}/stat 2>/dev/null)
CMDLINE=$(awk -F '[=10=]' '{print }' /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}: "
}
export -f test_func get_scriptname
bash -c "test_func param0"
echo -e "param1\nparam2\nparam3" | xargs -n 1 -i bash -c "test_func {}"
我有一个脚本 /usr/bin/test.sh,看起来像这样:
test_func()
{
echo "callertest 1:"
cat /proc/$PPID/cmdline | tr '[=10=]' ' '
echo "callertest 2:"
ps aux | grep $PPID
}
export -f test_func
bash -c test_func
因为“/usr/bin”在 $PATH 中,我用 "test.sh" 调用脚本。该函数应该回显脚本的名称或更好的完整路径,但我除了获得 "bash" 之外没有得到任何进一步的信息。似乎是放置在 $PATH 中的脚本的问题。
不要使用函数,而是将代码放在脚本中:
#!/bin/bash
echo "callertest 1:"
cat /proc/$PPID/cmdline | tr '[=10=]' ' '
echo "callertest 2:"
ps aux | grep $PPID
确保它是可执行的:
chmod +x test_script.bash
然后用xargs
执行:
seq 10 | xargs -n 1 -P $(nproc) ./test_script.bash
这应该涵盖所有情况:
get_scriptname()
{
SCRIPTFILE=$(readlink -e -- "[=10=]" 2>/dev/null)
until [ -e "${SCRIPTFILE}" ] || [ "$_PPID" = "0" ] ; do
_PPID=$(awk '{print }' /proc/${_PPID:-$$}/stat 2>/dev/null)
CMDLINE=$(awk -F '[=10=]' '{print }' /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}: "
}
export -f test_func get_scriptname
bash -c "test_func param0"
echo -e "param1\nparam2\nparam3" | xargs -n 1 -i bash -c "test_func {}"