Що таке команда unix, щоб дізнатися, який виконуваний файл відповідає даній команді?


18

Наприклад, якщо передано ls як вхідні дані він повинен сказати мені, що /bin/ls буде запущено, якщо запущено ls у командному рядку.

Відповіді:


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 Shell, zsh, вбудований whence з командою command вбудований з -v варіант еквівалентний whence і вбудовані модулі type, which, і where дорівнює whence з опціями -v, -c, і -ca відповідно.

    $ whence ls
    /bin/ls
    
  • Для T C Shell, tcsh, вбудований which command - не можна плутати з будь-якою зовнішньою командою за такою назвою:

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

Подальше читання


Зверніть увагу, що під ksh "type" є псевдонімом за замовчуванням для "wherece -v", тому його можна використовувати так само, як з традиційною оболонкою та bash.
jlliagre

type також вбудовано до zsh?
Hongxu Chen

RHEL6, який RPM (наприклад, which-2.19-6.el6.x86_64 ) ставить файл запуску /etc/profile.d/which2.sh. Це зчитуються не csh оболонками, включаючи zsh. Це псевдоніми which до себе. Тому для користувачів zsh, зокрема, він перекриває розрив вбудованого which.
Dan Pritts

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'

3
Будьте обережні: якщо ls є функцією або псевдонімом, ви хочете "тип ls", а не "який ls"
William Pursell

1
which не обов'язково достатньо самостійно. Вона лише повертає спочатку знайдено ім'я в $ PATH ... Що ім'я може бути символічним посиланням, і ні фактичне кінець ланцюга виконуваний файл.
Peter.O

7

which робить ні (обов'язково) повернути виконуваний файл. Вона повертає перший відповідний файл ім'я він знаходить у $ PATH (або декількох подібних іменованих файлів при використанні which -a ) ... The фактичний виконуваний файл може бути декількома посиланнями.

  • 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.