3

如果我在 bash shell 中运行此命令:

script1 -i foo | script2 -i bar | script3 -i foobar

是否有一种可靠的方法来获取该命令,因为它会出现在 script1-3 中的 bash_history 中?

据我所知,从 .bash_history 文件中获取信息是行不通的,因为写入该文件是缓冲的,因此可能不同步。

4

1 回答 1

0

您可以将操作系统级别的跟踪器附加到您的程序,然后查找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;
}
于 2013-09-20T09:09:07.727 回答