如果我在 bash shell 中运行此命令:
script1 -i foo | script2 -i bar | script3 -i foobar
是否有一种可靠的方法来获取该命令,因为它会出现在 script1-3 中的 bash_history 中?
据我所知,从 .bash_history 文件中获取信息是行不通的,因为写入该文件是缓冲的,因此可能不同步。
您可以将操作系统级别的跟踪器附加到您的程序,然后查找exec
系统调用。
那些通过外壳的显示为["sh", "-c", "$cmd"]
,$cmd
是您正在寻找的。
例如,在 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;
}