如何在这行中运行的脚本中获取bash中运行的完整代码?
ping -c 2 google.com & ping -c 2 aol.com | grep aol & sh myscript.sh
我想以某种方式检索myscript.sh中的完整上线。 我目前的做法是:
ping -c 2 google.com & ping -c 2 aol.com | grep aol & ps -ef --sort=start_time
然后关联PPID和流程的开始时间以获取运行的内容。
UID PID PPID C STIME TTY TIME CMD
nm+ 2881 6599 0 12:09 pts/1 00:00:00 ping -c 2 google.com
nm+ 2882 6599 0 12:09 pts/1 00:00:00 ping -c 2 aol.com
nm+ 2883 6599 0 12:09 pts/1 00:00:00 grep --color=auto abc
nm+ 2884 6599 0 12:09 pts/1 00:00:00 ps -ef --sort=start_time
我不喜欢它,因为我无法说明进程是如何连接的(管道或只是并行执行),因此无法重建在bash中运行的确切行。也是以正确的方式破解的感觉。
答案 0 :(得分:1)
你可以grep" pipe"从lsof
中找到进程的管道标识中的相关命令,找到进程标识并查找相关进程的详细信息。
答案 1 :(得分:0)
假设bash 4.0或更新版本:
#!/usr/bin/env bash
exec 3>"$1"; shift
BASH_XTRACEFD=3 PS4=':$BASH_SOURCE:$LINENO:+'
set -x
source "$@"
...如果保存为bash_trace
,则用作:
bash_trace logfile scriptname arg1 arg2 ...
...然后,要查找实际行号,可以使用以下内容:
IFS=: read -r filename lineno _ < <(tail -n 1 logfile)
sed -e "${lineno}q;d" <"$filename"