1

Как мне перечислить все команды в моем пути, которые скрыты другими командами?

Например, если у меня есть /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 ответ1

1

В качестве отправной точки или для получения ответа, когда вы знаете команды, которые вы хотите проверить.

Команда which используется для отображения полного пути команд оболочки. -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;
  }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .