'который', но все

Вы можете с ip команда, и, учитывая, что ifconfig находится в процессе того, чтобы быть удержавшим от использования большинством дистрибутивов, это - теперь предпочтительный инструмент. Пример:

$ ip route show
212.13.197.0/28 dev eth0  proto kernel  scope link  src 212.13.197.13
default via 212.13.197.1 dev eth0
20
20.03.2011, 01:29
4 ответа

В некоторых системах, which -a шоу все соответствия. Если Ваша оболочка является ударом или zsh ¹, можно использовать type вместо этого: type foo показывает первое соответствие и type -a foo шоу все соответствия. Три команды type, which и whence сделайте главным образом то же самое; они отличаются между оболочками и операционными системами в доступности, опциях, и о чем точно они сообщают. type всегда доступно и показывает все возможные подобные команде имена (псевдонимы, ключевые слова, созданная-ins оболочка, функции и внешние команды).

Единственный полностью портативный способ отобразить все соответствия состоит в том, чтобы проанализировать $PATH самостоятельно. Вот сценарий оболочки, который делает это. При создании этого функцией оболочки удостоверьтесь, что включили тело функции в круглые скобки (так, чтобы изменение в IFS и set -f не выходите из функции), и изменение exit кому: return.

#!/bin/sh
set -f       # disable globbing
IFS=:        # break words at : only
not_found=1
for d in $PATH; do
  if [ -f "$d/$x" ] && [ -x "$d/$x" ]; then
    printf '%s\n' "$d/$x"
    not_found=0
  fi
done
exit $not_found

¹ Или ksh 93, согласно документации, хотя ksh 93 + 31.01.2008 только печать первое соответствие, когда я пробую.

23
27.01.2020, 19:44
  • 1
    Это sh код не работает правильно, если существуют пустые компоненты в $PATH. Также отметьте это $IFS разделитель полей (в оболочках POSIX, по крайней мере) в то время как в $PATH, двоеточие используется в качестве разделителя полей. Посмотрите which сценарий найден на Debian для корректной реализации. –  Stéphane Chazelas 25.11.2013, 17:28
  • 2
    type встроенный в ksh93u+ 2012-08-01 кажется, работает правильно. –  Stéphane Chazelas 25.11.2013, 17:29

- все или флаг-a покажут Вам всем соответствия в Вашем пути и псевдонимы (по крайней мере, на Fedora, Ubuntu и CentOS):

which -a which

На AIX и Солярисе, это получит Вас близко:

echo "$PATH" | sed -e 's/:/ /g' | \
while read -r p; do find "$p" -type f -name "which"; done
5
27.01.2020, 19:44
  • 1
    Вам нужны двойные кавычки вокруг замен параметра, иначе сценарий не будет работать если $PATH содержит пробел или оболочку globbing символы. read -r необходимо для преодоления обратных косых черт. Это не хороший метод потому что find займет много времени и может возвратить побочные соответствия если каталог в $PATH содержит подкаталоги. К счастью, find не полезно здесь; см. мой ответ. –  Gilles 'SO- stop being evil' 20.03.2011, 02:30
  • 2
    , который я знал, находит чувствовавшими неправильно, так как это, конечно, было бы медленно во вложенных каталогах. Globbing и пробелы в $PATH? eww. Но Вы правы (хотя Вы были достаточно хороши не сказать так же): мой один лайнер был плохо записан. –  Eli Heady 20.03.2011, 03:25

Если у Вас нет a which поддержка -a, или whence доступный, самокрутка:

#!/bin/sh -f

IFS=":"
for PART in $PATH
do
  if test -x "$PART/$1"
  then
    echo $PART/$1
  fi
done
1
27.01.2020, 19:44
  • 1
    Вы отсутствуете set -f выключить globbing на незащищенном $PATH. test -f не достаточно с тех пор, только исполняемые файлы требуются здесь; Вам нужно test -x. Хм, я понимаю, что забыл регулярный тест файла в своем сценарии. –  Gilles 'SO- stop being evil' 21.03.2011, 23:03
  • 2
    @Gilles: отредактированный согласно Вашим подсказкам. Я - все для правильности, но я нахожу whence README.txt настолько же вряд ли как whence "file* wi?h we!rd name". Просто пытаясь показать, как легкий это должно пересечь $PATH. –  MattBianco 22.03.2011, 10:58

ksh и zsh имеют "откуда" как встроенная оболочка. whence -a делает то, что Вы хотите под zsh:

 7:27AM 7 % whence -a cat
/usr/bin/cat
/bin/cat
/usr/bin/cat
/bin/cat

Я должен очистить ПУТЬ в zsh, у меня есть много дубликатов в нем. whence -a работы по-другому под ksh:

$ whence -a cat
cat is a tracked alias for /usr/bin/cat

Я должен сказать, который походит на потенциально полезное поведение, также.

0
27.01.2020, 19:44

Теги

Похожие вопросы