Como faço para listar comandos sombreados por outros comandos no PATH?

1

Como faço para listar todos os comandos no meu caminho que são sombreados por outros comandos?

Por exemplo, se eu tiver /bin/foo , /bin/bar , /usr/local/bar e /usr/bin/foo , quero ver algo como

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

Eu acho que posso juntar algo baseado em ls e comm , mas eu preferiria algo pronto, especialmente bash -based (também seria bom se aliases e funções fossem procuradas também , mas isso não é muito importante).

    
por sds 07.11.2013 / 21:02

1 resposta

1

Como ponto de partida ou para obter a resposta quando você souber os comandos que deseja verificar.

O comando which é usado para mostrar o caminho completo dos comandos do shell. A opção -a ou -all listará todas as correspondências, não apenas a primeira.

which --all foo

Para todos os comandos em seu caminho existe um pequeno utilitário do PerlMonks: Pathfinder - encontre programas duplicados (sombreados) em seu 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;
  }
}
    
por 07.11.2013 / 21:31