如何列出 PATH 中被其他命令遮蔽的命令?

如何列出 PATH 中被其他命令遮蔽的命令?

我如何列出全部我的路径中哪些命令被其他命令所遮蔽?

例如,如果我有/bin/foo/bin/bar/usr/local/bar/usr/bin/foo我希望看到类似

foo in /bin shadows /usr/bin
bar in /bin shadows /usr/local/bin

我想我可以根据ls和把一些东西拼凑在一起comm,但我更喜欢一些开箱即用的东西,尤其是bash基于的(如果别名和函数也被搜索那就好了,但这不是太重要)。

答案1

作为起点或当您知道要检查的命令时获取答案。

which命令用于显示 shell 命令的完整路径。-a-all开关将列出所有匹配项,而不仅仅是第一个。

which --all foo

对于路径中的所有命令,PerlMonks 都有一个小实用程序:Pathfinder - 查找 PATH 中的重复(阴影)程序

#!/usr/bin/perl -w
use strict;

my @path = split /:/, $ENV{PATH};
my %path_inodes;
my @clean_path;

for (@path) {
  next unless m#^/#;
  my ($dev,$ino) = stat;
  next unless defined $dev;
  my $key = "$dev $ino";
  if (exists $path_inodes{$key}) {
    print "warning: $_ is linked to $path_inodes{$key}\n";
    next;
  }
  $path_inodes{$key} = $_;
  push @clean_path, $_;
}

my %progs;

## print "clean path is @clean_path\n";

for my $dir (@clean_path) {
  use DirHandle;
  my @files =
    sort grep !/^\.\.?$/,
    DirHandle->new($dir)->read;
  ## print "$dir: @files\n";
  for my $file (@files) {
    if (exists $progs{$file}) {
      print "$file in $dir is shadowed by $progs{$file}\n";
      next;
    }
    $progs{$file} = $dir;
  }
}

相关内容