如果我在bash shell中运行此命令:
script1 -i foo | script2 -i bar | script3 -i foobar
是否有一种强大的方法来获取该命令,因为它将出现在script1-3中的bash_history中?
据我所知,从.bash_history文件获取信息是不行的,因为写入该文件是缓冲的,因此可能不同步。
答案 0 :(得分:0)
您可以将OS级别跟踪器附加到您的程序,然后查找exec
系统调用。
通过shell的内容显示为["sh", "-c", "$cmd"]
,$cmd
正是您要找的。 p>
例如,在Linux上,使用strace
:
#!/usr/bin/perl
my $parent = $$;
my $pid = fork;
unless ($pid) {
defined $pid or die "fork failed: $!\n";
open STDOUT, '>&STDERR'; # redirect stdout to stderr
do { exec('strace',
-p => $parent,
-e => 'trace=clone,execve',
-e => 'signal=none',
-s => 32000,
-b => 'execve',
'-f', '-qq') };
warn "exec failed: $!\n";
POSIX::_exit(1);
}
sleep 2; # wait for strace to attach to me
system 'ls $HOME';
system 'echo /*';
END {
kill TERM => $pid;
}