我如何列出全部我的路径中哪些命令被其他命令所遮蔽?
例如,如果我有/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;
}
}