19

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

4 ответа4

23

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

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

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

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

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

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

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

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

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

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'
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
4

Ты можешь попробовать:

whereis ls

Это дает мне:

ls: /bin/ls /usr/share/man/man1/ls.1.gz

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