my $mydollarzero = sub {
my($arg) = shift;
$0 = $arg if defined $arg;
- my $ps = `ps -o command= -p $$`;
+ # In FreeBSD the ps -o command= will cause
+ # an empty header line, grab only the last line.
+ my $ps = (`ps -o command= -p $$`)[-1];
return if $?;
chomp $ps;
printf "# 0[%s]ps[%s]\n", $0, $ps;
$ps;
};
my $ps = $mydollarzero->("x");
- ok(!$ps || # we allow that something goes wrong with the ps command
- $ps eq "x", 'altering $0 is effective (testing with `ps`)');
+ ok(!$ps # we allow that something goes wrong with the ps command
+ # In Linux 2.4 we would get an exact match ($ps eq 'x') but
+ # in Linux 2.2 there seems to be something funny going on:
+ # it seems as if the original length of the argv[] would
+ # be stored in the proc struct and then used by ps(1),
+ # no matter what characters we use to pad the argv[].
+ # (And if we use \0:s, they are shown as spaces.) Sigh.
+ || $ps =~ /^x\s*$/
+ # FreeBSD cannot get rid of both the leading "perl :"
+ # and the trailing " (perl)": some FreeBSD versions
+ # can get rid of the first one.
+ || ($^O eq 'freebsd' && $ps =~ m/^(?:perl: )?x(?: \(perl\))?$/),
+ 'altering $0 is effective (testing with `ps`)');
} else {
skip("\$0 check only on Linux and FreeBSD") for 0, 1;
}