Что такое команда unix, чтобы узнать, какой исполняемый файл соответствует данной команде?

22

Например, если он передан в lsкачестве входных данных, он должен сказать мне, что /bin/lsбудет работать, если запускать lsиз командной строки.

hugomg
источник

Ответы:

25

Используемая команда варьируется от оболочки к оболочке.

Только встроенная оболочка скажет правильно, что будет делать оболочка для данного имени команды, поскольку только встроенные модули могут полностью знать об алиасах, функциях оболочки, других встроенных модулях и т. Д. Помните: во-первых, не все команды соответствуют исполняемым файлам.

  • Для Bourne Again оболочки bash, встроенный является typeкоманда:

    $ type '['
    [ is a shell builtin
    
  • Для рыбы оболочкиfish , The typeвстроенный работает аналогично Баш. Чтобы получить только путь к исполняемому файлу, используйте command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Для Korn Shell, ksh, встроенный является whenceкоманда - с typeпервоначально установлен как обычный псевдоним whence -vи commandвстроенный с -vопцией , эквивалентной whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Для Z Shell, zsh, встроенные в это whenceкоманда, с commandвстроенным с -vопцией эквивалентных whenceи встроенными модулями type, whichи whereэквивалентен whenceс параметрами -v, -cи -caсоответственно.

    $ whence ls
    /bin/ls
    
  • Для ТС Shell, tcsh, встроенные является whichкоманда - не следует путать с любой внешней командой с таким именем:

    > which ls
    ls: aliased to ls-F
    > which \ls
    /bin/ls
    

дальнейшее чтение

JdeBP
источник
Обратите внимание, что в ksh «type» является псевдонимом по умолчанию для «wherece -v», поэтому его можно использовать так же, как и в традиционных оболочках bourne и bash.
Jlliagre
typeтакже встроен в Zsh?
Хунсю Чен
RHEL6, в который RPM (например, which-2.19-6.el6.x86_64) помещает файл запуска /etc/profile.d/which2.sh. Это читается не-csh оболочками, включая zsh. Это псевдонимы whichдля себя. Так что для пользователей Zsh, в частности, он переопределяет разрывы встроенного which.
Дэн Притц
14

Вы можете использовать whichдля этого:

aix@aix:~$ which ls
/bin/ls

Он работает путем поиска PATHисполняемых файлов, соответствующих именам аргументов. Обратите внимание, что это не работает с псевдонимами оболочки:

aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin    dev   initrd.img      lib32   media  proc  selinux  tmp  vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$

typeОднако работает:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
NPE
источник
3
Будьте осторожны: если ls является функцией или псевдонимом, вам нужно «тип ls», а не «which ls»
Уильям Перселл,
1
whichне обязательно достаточно само по себе. Он возвращает только первое найденное имя в $ PATH ... Это имя может быть символической ссылкой, а не фактическим исполняемым файлом конца цепочки .
Peter.O
8

whichэто не (обязательно) возвращает исполняемый файл. Он возвращает первое совпадающее имя файла, которое он находит в $ PATH (или несколько похожих именованных файлов при использовании which -a) ... Фактический исполняемый файл может содержать несколько ссылок.

  • which locate
    /usr/bin/locate
    `
  • file $(which locate)
    /usr/bin/locate: symbolic link to /etc/alternatives/locate'

Команда, которая находит фактический исполняемый файл readlink -e,
(в сочетании с which)

  • readlink -e $(which locate)
    /usr/bin/mlocate

Чтобы увидеть все промежуточные ссылки :

f="$(which locate)"             # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do  # follow links to executable
    printf "# %s\n" "$f"
done

# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate
Peter.O
источник
4

Можешь попробовать:

whereis ls

Это дает мне:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Иван Моргилло
источник