Один из самых распространённых вопросов от подписчиков — как получить путь к команде Linux, которую только что установили в систему с помощью пакетного менеджера, например, команды apt или DNF. Много новых разработчиков переходит к нам из мира Windows, и для многих это первый опыт использования Linux. Некоторые используют WSL (подсистему Linux в Windows 10), а остальные работают с облачными серверами напрямую по SSH. Рассмотрим ряд распространённых команд, с помощью которых можно отобразить список команд Linux или получить к ним путь.

▍ Что такое команда Linux?


Пользовательский интерфейс Windows по умолчанию графический. Однако у ОС Linux на стороне сервера по умолчанию текстовый интерфейс. Поэтому часто используются такие термины как Bash, оболочка пользователя, консоль, приглашение командной строки, терминал и так далее. Все они относятся к текстовому интерфейсу.

К примеру, в MS Windows-приложения запускаются через кнопку «Пуск». У терминала Linux назначение схожее, но туда вводятся инструкции, известные как команды Linux. Итак, вызываем терминал Linux сочетанием клавиш Ctrl–Alt–T. Затем вводим простую команду — например date, чтобы просмотреть текущую дату и время. Текст команды вводится только строчными буквами. Для запуска команды надо нажать кнопку Enter:


date, pwd, hello и ping — это команды Linux.


▍ Различные типы команд Linux


Команды Linux, которые вводят в терминал, бывают разных типов:

  1. Внутренняя или встроенная, команда оболочки.
  2. Внешняя команда / исполняемый файл.
  3. Функция оболочки.
  4. Псевдоним.
  5. Ключевое слово.


▍ Как определить тип команды Linux


Чтобы просмотреть путь к любой команде Linux, достаточно ввести в терминал команду type. С её же помощью можно узнать тип целевой команды: встроенная команда оболочки, псевдоним, функция или внешняя. Синтаксис следующий:

type command
type -t command
type -a command

Например, давайте выясним тип команды pwd:

type pwd
type date
type hello
type ping
 
# Display a single word which is one of 'alias', 'keyword', 'function', 'builtin', 
# 'file or '' , if command is an alias, shell reserved word, shell function, shell builtin, 
# disk file, or not found, respectively
type -t ping
type -t if
type -t vi
type -t nano
 
# The '-a' option shows all locations containing an executable named ping
type -a ping



▍ Что такое переменная $PATH?


В Linux и Unix-подобных системах переменная PATH содержит перечень путей, по которым хранятся исполняемые программы, например ping, date, vi, docker и так далее. Чтобы просмотреть текущую переменную path, воспользуйтесь командой echo /printf:

echo "$PATH"
 
# OR
#
# More human readable format 
#
echo "${PATH//:/$'\n'}"

Вот что отображается у меня:

/home/vivek/google-cloud-sdk/bin
/home/vivek/.local/bin
/home/vivek/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

Для просмотра всех исполняемых файлов в папке /bin/, выполните команду ls следующим образом:
ls /bin/
ls -l /bin/


▍ Как отобразить информацию о командах


Чтобы получить путь к команде Linux, введите command следующим образом:

command -v date
command -v pwd
command -v ping
command -v docker



▍ Как найти команду Linux


А ещё можно легко получить путь к команде Linux с помощью команды which. Пример:

which gcc
which nano

Чтобы отобразить все возможные совпадающие пути, воспользуйтесь опцией -a:

which -a ls



▍ Получаем путь к команде или man-странице Linux


Чтобы найти двоичный файл, исходный код и man-страницу какой-либо программы или команды на диске, используйте команду whereis в следующем синтаксисе:
whereis command
whereis gcc
whereis docker
whereis lxc
whereis vim

Надо, чтобы отображались только двоичные файлы? Есть вот такой вариант:

whereis -b ls

Ищете только руководства и справочные страницы? Проще простого:

whereis -m date
whereis -m gcc



▍ Команды find и locate


Файлы можно также искать по имени файла. К примеру, так будет выглядеть поиск файла, в имени которого содержится слово ‘date’:

locate -b '\date'
## OR ##
find / -name "date" -ls
# sudo for all files 
sudo find / -name "date" -ls

Результаты выполнения команды locate:

/snap/core/11316/bin/date
/snap/core/11420/bin/date
/snap/core18/2066/bin/date
/snap/core18/2074/bin/date
/snap/core20/1026/usr/bin/date
/snap/core20/1081/usr/bin/date
/usr/bin/date
/usr/lib/byobu/date


▍ Вывод справки о командах Linux


С этим нам помогут команды whatis, help, man или info.

Команда whatis:
К каждой команде Linux прилагается man-страница (руководство, описывающее способ применения и синтаксис команды). Кроме того, справка содержит краткое описание команды. Для поиска по названиям man-страниц используется команда whatis. Она отображает описания команд для любых названий, введенных в краткой форме:

whatis ls
whatis clear
whatis date
whatis gcc



Для всех внешних команд используются команды man или info, которые выводят на экран подробное руководство:

man date
man ls
man gcc
man bash
info ls
info bash
man which



Для ключевых слов и встроенных команд Bash используется команда help:

help if
help exit
help logout
help type
help command

▍ В качестве заключения


Основная проблема, с которой сталкиваются новоиспечённые пользователи Linux — поиск команд. Но благодаря этому доступному руководству вы теперь умеете получать путь к нужным командам и даже выводить справку о них в формате man-страниц. Предположим, вы установили Docker на сервер Ubuntu. Получить путь к этой системе и изучить руководство можно с помощью следующих команд:

whatis docker
whereis docker
type -a docker
which docker
find / -iname "docker"
locate -b '\docker'
man docker



Если вы работаете с сервером Debian или Ubuntu Linux, вам пригодятся следующие две команды. Отобразить список всех файлов, установленных на сервер пакетом Docker, можно командой dpkg:

dpkg -L docker-ce
dpkg -L docker-ce | more

Результат:

/.
/etc
/etc/default
/etc/default/docker
/etc/init
/etc/init/docker.conf
/etc/init.d
/etc/init.d/docker
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/docker.service
/lib/systemd/system/docker.socket
/usr
/usr/bin
/usr/bin/docker-init
/usr/bin/docker-proxy
/usr/bin/dockerd
/usr/share
/usr/share/doc
/usr/share/doc/docker-ce
/usr/share/doc/docker-ce/README.md
/usr/share/doc/docker-ce/changelog.Debian.gz

Вывести на экран информацию о пакете Docker можно с помощью команды apt:

apt show docker-ce

Результат:

Package: docker-ce
Version: 5:19.03.13~3-0~ubuntu-bionic
Priority: optional
Section: admin
Maintainer: Docker <support@docker.com>
Installed-Size: 107 MB
Depends: docker-ce-cli, containerd.io (>= 1.2.2-3), iptables, libseccomp2 (>= 2.3.0), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97), libsystemd0
Recommends: aufs-tools, ca-certificates, cgroupfs-mount | cgroup-lite, git, pigz, xz-utils, libltdl7, apparmor
Conflicts: docker (<< 1.5~), docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package
Replaces: docker-engine
Homepage: https://www.docker.com
Download-Size: 22.5 MB
APT-Manual-Installed: yes
APT-Sources: https://download.docker.com/linux/ubuntu bionic/edge amd64 Packages
Description: Docker: the open-source application container engine
 Docker is a product for you to build, ship and run any application as a
 lightweight container
 .
 Docker containers are both hardware-agnostic and platform-agnostic. This means
 they can run anywhere, from your laptop to the largest cloud compute instance and
 everything in between - and they don't require you to use a particular
 language, framework or packaging system. That makes them great building blocks
 for deploying and scaling web apps, databases, and backend services without
 depending on a particular stack or provider.
 
N: There are 29 additional records. Please use the '-a' switch to see them.

Надеюсь, новым пользователям и разработчикам Linux эти команды окажутся полезны.

Комментарии (14)


  1. Shtucer
    16.11.2021 17:04

    type -t ping

    type: bad option: -t


    1. teleport_future
      16.11.2021 23:33

      CentOS (установлена на "минималках") - все работает:

      [~]# type -t ping

      [~]# file


  1. zmc
    16.11.2021 18:50
    -4

    Слов нет, промолчу...


    1. asand3r
      17.11.2021 00:29
      +2

      Но ты же не промолчал...


      1. alex103
        17.11.2021 07:02
        +1

        Он просто забыл указать ключи.. )))

        $zmc -x -s

        $

        $zmc --help

        zmc

        -x exсlude words

        -s silent


        1. zmc
          17.11.2021 18:26
          -3

          sorry действительно забыл


          cat alex103 > /dev/null

          плохо что /dev/trash не поддерживается


  1. igorp1024
    17.11.2021 00:49
    +2

    Немножко не по теме статьи, но дополню рецепт про листинг пакета в дебиане.

    Как в дебиане/убунте найти именно пакет, в котором есть интересующий нас бинарник?

    $ dpkg -S filename


    1. zmc
      17.11.2021 06:20
      +1

      dpkg -S ищет по базе установленных пакетов.

      Возможно будет лучше воспользоваться apt-file она ищет везде и по шаблону.


  1. A1EF
    17.11.2021 10:34
    +7

    dpkg -L docker-ce | more

    Это как же надо ненавидеть новичков в Linux, чтобы заставить использовать more вместо less!


  1. Vesh
    17.11.2021 14:02
    +1

    Текст команды вводится только строчными буквами

    Всё пропало, я больше никогда не смогу запустить Dwarf_Fortress!


  1. slepnoga
    17.11.2021 16:02

    В Linux и Unix-подобных системах переменная PATH содержит перечень папок, в которых хранятся исполняемые программы, 

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


  1. Tibor128
    18.11.2021 17:17
    +1

    типы команд... type...

    file `which command` - не?

    практически все, что Вы называете командами, есть отдельные, вполне самостоятелтные программы, не зависящие от, как Вы выразились "оболочки". Даже используемая всеми в скриптах квадратная скобка " [" всего лишь симлинк на программу test.


    1. invasy
      20.11.2021 13:33

      В некоторых оболочках всё же есть и дублирующие встроенные команды. Например, в bash `[` — это builtin.


  1. ukhanov
    18.11.2021 18:49
    +1

    В копилку: apropos mask

    Ищет подстроку mask в именах всех установленных команд.