Π‘ΡΠΊΠΎΠ½ΠΎΠΌΡŒΡ‚Π΅ 15% Π½Π° всСх хостинговых услугах

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свои Π½Π°Π²Ρ‹ΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ скидку Π½Π° любой Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills ΠΠ°Ρ‡Π°Ρ‚ΡŒ
Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
Linux

Команда `which` Π² Linux: ПолноС тСхничСскоС руководство с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ

Команда `which` Π² Linux Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ исполняСмого Ρ„Π°ΠΉΠ»Π°, сканируя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, пСрСчислСнныС Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния `PATH`, ΠΈ возвращая ΠΏΠ΅Ρ€Π²ΠΎΠ΅ совпадСниС. Π­Ρ‚ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, близкая ΠΊ стандарту POSIX, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ систСмныС администраторы, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ DevOps-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ располоТСния Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π°ΡƒΠ΄ΠΈΡ‚Π° срСд выполнСния ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ², связанных с PATH.

Когда Π²Ρ‹ запускаСтС `which python3`, ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Π½Π΅ выполняСт поиск ΠΏΠΎ всСй Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС β€” ΠΎΠ½Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ двоСточиями списку ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², хранящихся Π² `$PATH`, слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, ΠΈ останавливаСтся Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ совпадСнии. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΅Ρ‘ Π³Π»Π°Π²Π½Ρ‹ΠΌ прСимущСством ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ синтаксис

β€œ`bash

which [options] command_name [command_name …]

β€œ`

  • `[options]` β€” ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСны Π½ΠΈΠΆΠ΅).
  • `command_name` β€” Одно ΠΈΠ»ΠΈ нСсколько ΠΈΠΌΡ‘Π½ исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ `which` ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ `which` ΠΊΠΎΠΌΠ°Π½Π΄Π° считываСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния `PATH`, Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎ раздСлитСлям `:` ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΎΠ½Π° провСряСт, сущСствуСт Π»ΠΈ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ установлСн Π»ΠΈ Ρƒ Π½Π΅Π³ΠΎ Π±ΠΈΡ‚ исполнСния (ΠΏΡ€Π°Π²Π° `x`). ΠŸΠ΅Ρ€Π²ΠΎΠ΅ совпадСниС выводится Π½Π° стандартный Π²Ρ‹Π²ΠΎΠ΄.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ `which` ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ зависит ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния `$PATH`. Если ваш `PATH` настроСн Π½Π΅Π²Π΅Ρ€Π½ΠΎ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ стоит послС `/usr/bin` вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ β€” `which` Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ эту Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ `PATH`:

β€œ`bash

echo $PATH

Example output:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

β€œ`

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: Поиск ΠΎΠ΄Π½ΠΎΠ³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°

НаиболСС Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ β€” Π½Π°ΠΉΡ‚ΠΈ, Π³Π΄Π΅ находится Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»:

β€œ`bash

which python3

β€œ`

β€œ`

/usr/bin/python3

β€œ`

Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ `python3` систСма выполняСт `/usr/bin/python3`. Если Π²Ρ‹ скомпилировали ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ сборку ΠΈ помСстили Π΅Ρ‘ Π² `/opt/python3.12/bin/`, Π½ΠΎ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² `PATH`, `which` Π΅Ρ‘ Π½Π΅ Π½Π°ΠΉΠ΄Ρ‘Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: Запрос Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄

МоТно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ нСсколько ΠΈΠΌΡ‘Π½ ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ β€” это ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈ Π°ΡƒΠ΄ΠΈΡ‚Π΅ срСды сборки:

β€œ`bash

which python3 gcc git curl wget

β€œ`

β€œ`

/usr/bin/python3

/usr/bin/gcc

/usr/bin/git

/usr/bin/curl

/usr/bin/usr/bin/wget

β€œ`

Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² скриптах Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ CI/CD-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ², Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… инструмСнтов ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ сборки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: Поиск всСх экзСмпляров с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `-a`

Π€Π»Π°Π³ `-a` ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ `which` ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ поиск послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ совпадСния ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΠΎ всСх Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… экзСмплярах Π²ΠΎ всСх ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… `PATH`:

β€œ`bash

which -a python3

β€œ`

β€œ`

/usr/bin/python3

/usr/local/bin/python3

β€œ`

Π­Ρ‚ΠΎ критичСски Π²Π°ΠΆΠ½ΠΎ Π² срСдах, Π³Π΄Π΅ установлСно нСсколько вСрсий Python β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, систСмный Python ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ `/usr/bin/python3` ΠΈ вСрсия, управляСмая pyenv, ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ `/usr/local/bin/python3`. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стоит ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² `PATH`, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½. Если Π°ΠΊΡ‚ΠΈΠ²Π½Π° нСвСрная вСрсия, этот Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚, Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚.

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай: На сСрвСрах, Π³Π΄Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ установлСны Node.js ΠΈΠ· дистрибутива ΠΈ Node.js, управляСмый nvm, `which -a node` Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ выявляСт Π΄Π²Π° ΠΈΠ»ΠΈ Ρ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡƒΡ‚ΠΈ. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ трСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок записСй `PATH` Π² `.bashrc` ΠΈΠ»ΠΈ `.zshrc`, Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4: ПовСдСниС ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ псСвдонимов

ПовСдСниС `which` с псСвдонимами Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ зависит ΠΎΡ‚ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ `which`, установлСнной Π² систСмС.

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… дистрибутивах Linux `which` являСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ внСшним Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ (Π½Π΅ встроСнной ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ), поэтому Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ доступа ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ псСвдонимов Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. Однако Π² систСмах, Π³Π΄Π΅ `which` Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ функция ΠΈΠ»ΠΈ псСвдоним ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ (Ρ‡Ρ‚ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ zsh), ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ псСвдонимы:

β€œ`bash

alias ls='ls –color=auto'

which ls

β€œ`

Π’ систСмС zsh с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ `which`:

β€œ`

ls: aliased to ls –color=auto

β€œ`

Π’ систСмС bash с внСшним Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ `which`:

β€œ`

/bin/ls

β€œ`

Π­Ρ‚Π° Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ являСтся ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстным источником ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· основных ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ администраторы ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `type` ΠΈΠ»ΠΈ `command -v` Π² скриптах (рассмотрСно Π½ΠΈΠΆΠ΅).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5: ИспользованиС `which` Π² условной Π»ΠΎΠ³ΠΈΠΊΠ΅ скриптов

Распространённый ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π² скриптах ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ β€” использованиС `which` для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ зависимости ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ выполнСния:

β€œ`bash

if ! which docker > /dev/null 2>&1; then

echo "Docker is not installed or not in PATH. Aborting."

exit 1

fi

β€œ`

Однако Π±ΠΎΠ»Π΅Π΅ пСрСносимым ΠΈ POSIX-совмСстимым ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ для скриптов являСтся `command -v`:

β€œ`bash

if ! command -v docker > /dev/null 2>&1; then

echo "Docker not found."

exit 1

fi

β€œ`

Π­Ρ‚ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ написании скриптов, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… дистрибутивах ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°Ρ….

ВСхничСскоС сравнСниС `which`, `type` ΠΈ `command -v`

Π­Ρ‚ΠΈ Ρ‚Ρ€ΠΈ инструмСнта Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ, Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’Ρ‹Π±ΠΎΡ€ нСподходящСго инструмСнта ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡƒΠ»ΠΎΠ²ΠΈΠΌΡ‹ΠΌ ошибкам, особСнно Π² скриптах ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

Ѐункция`which``type``command -v`
Поиск Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Π”Π°Π”Π°Π”Π°
Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ псСвдонимов оболочкиЗависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΠ”Π° (всСгда)Π”Π° (всСгда)
Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ оболочкиНСтДаДа
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ встроСнных ΠΊΠΎΠΌΠ°Π½Π΄ оболочкиНСтДаДа
БоотвСтствиС стандарту POSIXНСтДаДа
НадёТная Ρ€Π°Π±ΠΎΡ‚Π° Π² скриптахРискованноРискованно (встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° bash)РСкомСндуСтся
Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π°Π’ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΡ‚ΡŒΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Ρ€ΠΎΠΊΠ°ΠŸΡƒΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅
Поиск ΠΏΠΎ всСм записям PATH (эквивалСнт `-a`)Π”Π° (с `-a`)Π”Π° (с `-a`)НСт
Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (Π½Π΅ встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π°)ДаНСт (встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π°)НСт (встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π°)

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `which` Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ быстро Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `type -a`, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС Ρ„ΠΎΡ€ΠΌΡ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (псСвдоним, функция, встроСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»).
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `command -v` Π² производствСнных скриптах ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для обСспСчСния пСрСносимости POSIX.

`type` Π² дСйствии

β€œ`bash

type -a python3

β€œ`

β€œ`

python3 is /usr/bin/python3

python3 is /usr/local/bin/python3

β€œ`

β€œ`bash

type ls

β€œ`

β€œ`

ls is aliased to `ls –color=auto'

β€œ`

`command -v` Π² дСйствии

β€œ`bash

command -v git

β€œ`

β€œ`

/usr/bin/git

β€œ`

β€œ`bash

command -v ll

β€œ`

β€œ`

ll: aliased to ls -alF

β€œ`

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ сцСнарии ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

ΠžΡ‚Π»Π°Π΄ΠΊΠ° Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ вСрсии Python

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщаСт, Ρ‡Ρ‚ΠΎ `python3 –version` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `3.9.x`, хотя ΠΎΠ½ установил `3.11` Ρ‡Π΅Ρ€Π΅Π· ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ сборку. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ диагностики:

β€œ`bash

which python3 # Shows the first match

which -a python3 # Shows all matches

echo $PATH # Reveals directory ordering

ls -la /usr/local/bin/python3 # Checks if the custom build is symlinked correctly

β€œ`

РСшСниС ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда сводится Π»ΠΈΠ±ΠΎ ΠΊ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ символичСской ссылкС, Π»ΠΈΠ±ΠΎ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ порядка записСй `PATH` Π² Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

Диагностика ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ послС установки

Если `which curl` Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°, Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π»ΠΈΠ±ΠΎ Π½Π΅ установлСн, Π»ΠΈΠ±ΠΎ установлСн Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½Π΅ входящий Π² `PATH`. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ эти случаи:

β€œ`bash

which curl # No output = not in PATH

find /usr -name curl -type f 2>/dev/null # Search for the binary outside PATH

apt list –installed 2>/dev/null | grep curl # Check package manager

β€œ`

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ инструмСнтам ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ

ΠŸΡ€ΠΈ настройкС Π½ΠΎΠ²ΠΎΠ³ΠΎ окруТСния VPS Π₯остинга стандартный Ρ‡Π΅ΠΊ-лист ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ запуск `which -a` для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ критичСски Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ расхоТдСния Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, тСстированиСм ΠΈ производством Π΄ΠΎ возникновСния сбоСв Π²ΠΎ врСмя выполнСния.

Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹Π΅ ограничСния `which`

ПониманиС этих ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΡƒΡŽ диагностику Π² слоТных срСдах:

  • ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости Ρ‚ΠΎΠ»ΡŒΠΊΠΎ `PATH`: `which` Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°, нСдоступного Ρ‡Π΅Ρ€Π΅Π· `$PATH`. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, установлСнныС Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `~/.local/bin`, Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² `PATH`.
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ освСдомлённости ΠΎ встроСнных ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ: ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ `cd`, `echo`, `alias` ΠΈ `source` ΡΠ²Π»ΡΡŽΡ‚ΡΡ встроСнными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. `which cd` Π²Π΅Ρ€Π½Ρ‘Ρ‚ пустой Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ»ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ `cd`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ даст вводящий Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.
  • Π’Π°Π±Π»ΠΈΡ†Ρ‹ псСвдонимов, спСцифичныС для ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ: `which` ΠΊΠ°ΠΊ внСшний Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ псСвдонимов Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π΅Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΌ для интроспСкции псСвдонимов Π² bash.
  • ΠŸΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ символичСских ссылок: `which` сообщаСт ΠΏΡƒΡ‚ΡŒ ΠΊ символичСской ссылкС, Π° Π½Π΅ ΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ. Если `/usr/bin/python3` являСтся символичСской ссылкой Π½Π° `/usr/bin/python3.11`, `which python3` ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ `/usr/bin/python3`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `readlink -f $(which python3)` для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ `sudo`: Запуск ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с `sudo` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `PATH` ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ `PATH` ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. `which node` ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ, Ρ‡Π΅ΠΌ `sudo which node`.

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ символичСских ссылок

β€œ`bash

readlink -f $(which python3)

Output: /usr/bin/python3.11

β€œ`

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€Π°Π² Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вмСстС с ΠΏΡƒΡ‚Ρ‘ΠΌ

β€œ`bash

ls -la $(which nginx)

Output: -rwxr-xr-x 1 root root 1234567 Jan 10 2024 /usr/sbin/nginx

β€œ`

БовмСстноС использованиС с `xargs` для ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ

β€œ`bash

echo "python3 gcc git" | xargs -n1 which

β€œ`

ИспользованиС Π² скриптах Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ окруТСния

На Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ слоТный стСк ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, скрипт Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ запускС ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€œ`bash

#!/bin/bash

REQUIRED_BINS="nginx php-fpm mysql redis-cli composer"

MISSING=0

for bin in $REQUIRED_BINS; do

if ! command -v "$bin" > /dev/null 2>&1; then

echo "MISSING: $bin"

MISSING=$((MISSING + 1))

else

echo "OK: $bin -> $(which $bin)"

fi

done

[ "$MISSING" -gt 0 ] && exit 1

exit 0

β€œ`

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°Ρ…

ПовСдСниС `which` Π½Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π²ΠΎ всСх срСдах Linux:

  • Bash: `which` ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся внСшним Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ (`/usr/bin/which`). Он Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ псСвдонимы ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bash, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π΅ экспортированы.
  • Zsh: МногиС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ zsh ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ `which` ΠΊΠ°ΠΊ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, которая Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ псСвдонимы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Ρ‘ Π²Ρ‹Π²ΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ, Π½ΠΎ ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΡ‚ повСдСния Π² bash.
  • Fish shell: Fish ΠΈΠΌΠ΅Π΅Ρ‚ собствСнный встроСнный эквивалСнт `which`, Π° Π΅Ρ‘ систСма псСвдонимов (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… `functions`) обрабатываСтся ΠΈΠ½Π°Ρ‡Π΅.
  • Alpine Linux / BusyBox-окруТСния: Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° `which` прСдоставляСтся BusyBox ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ GNU `which`.

Π­Ρ‚Π° Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π° ΠΏΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ прилоТСниями ΠΈΠ»ΠΈ настройкС ПанСлСй управлСния VPS, Π³Π΄Π΅ базовая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ вашСй локальной срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

БообраТСния бСзопасности

Π’ срСдах с ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ трСбованиями ΠΊ бСзопасности `which` ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π»Ρ‘Π³ΠΊΠΈΠΉ инструмСнт Π°ΡƒΠ΄ΠΈΡ‚Π°:

  • Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `sudo`, `su` ΠΈΠ»ΠΈ `passwd`, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Π΅ систСмныС ΠΏΡƒΡ‚ΠΈ, Π° Π½Π΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, доступныС для записи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ стоящиС Ρ€Π°Π½ΡŒΡˆΠ΅ Π² `PATH`.
  • ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° PATH: Ссли `which ls` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `/home/user/bin/ls` вмСсто `/bin/ls`, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±Ρ‹Π» Π²Π½Π΅Π΄Ρ€Ρ‘Π½ врСдоносный Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

β€œ`bash

Audit critical system binaries

for cmd in sudo su passwd ssh scp; do

echo "$cmd -> $(which $cmd)"

done

β€œ`

Π­Ρ‚ΠΎ стандартный шаг ΠΏΡ€ΠΈ усилСнии Π·Π°Ρ‰ΠΈΡ‚Ρ‹ сСрвСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ SSL-сСртификаты ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ TLS-Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, Π³Π΄Π΅ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ.

ΠŸΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ срСдами Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Π΅Π±-хостинга с нСсколькими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Π²Π°ΠΆΠ½Ρ‹ΠΌ срСдством контроля бСзопасности являСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, доступныС для записи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π½Π΅ стоят ΠΏΠ΅Ρ€Π΅Π΄ систСмными ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ Π² `PATH` Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ: ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠΉ инструмСнт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉΠ Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ инструмСнт
Быстрый ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ поиск ΠΏΡƒΡ‚ΠΈ`which`
Π‘ΠΊΡ€ΠΈΠΏΡ‚: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹`command -v`
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, являСтся Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° псСвдонимом ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ`type`
Поиск всСх экзСмпляров Π² PATH`which -a` ΠΈΠ»ΠΈ `type -a`
Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ символичСских ссылок Π΄ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°`readlink -f $(which …)`
Аудит Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° PATH`which` + ручная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° PATH
ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΡ‹Π΅ скрипты для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ`command -v`

ВСхничСскиС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Π²Ρ‹Π²ΠΎΠ΄Ρ‹

  • `which` выполняСт поиск Π² `$PATH` слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» β€” порядок записСй `PATH` Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½.
  • Π€Π»Π°Π³ `-a` Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ нСсколько вСрсий инструмСнта; Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр, Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² это.
  • НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `which` Π² производствСнных скриптах ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `command -v` для соотвСтствия стандарту POSIX ΠΈ согласованного повСдСния Π² bash, dash ΠΈ zsh.
  • `which` Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ встроСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ псСвдонимы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ сСансС ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ внСшний Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».
  • ВсСгда дополняйтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ `which` ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `readlink -f` ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ символичСских ссылок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ фактичСски выполняСмый Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».
  • Π’ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… срСдах `PATH` различаСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ контСкстами `sudo` ΠΈ Π½Π΅-`sudo` β€” всСгда провСряйтС Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ контСкстС.
  • ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ PATH Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, доступныС для записи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π½Π°Ρ‡Π°Π»ΠΎ `$PATH`, являСтся Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π°Ρ‚Π°ΠΊΠΈ; `which` β€” быстрый инструмСнт ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π°ΡƒΠ΄ΠΈΡ‚Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π½Π΅Π³ΠΎ.

Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

Π’ Ρ‡Ρ‘ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ `which` ΠΈ `whereis`?

`which` выполняСт поиск исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² `$PATH`. `whereis` ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ выполняСт поиск Π² Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… систСмных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для нахоТдСния Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π΅Π³ΠΎ страницы руководства ΠΈ исходных Ρ„Π°ΠΉΠ»ΠΎΠ². Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `whereis`, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ исходный ΠΊΠΎΠ΄ вмСстС с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ `which cd` Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚?

`cd` являСтся встроСнной ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π° Π½Π΅ внСшним исполняСмым Ρ„Π°ΠΉΠ»ΠΎΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ `which` сканируСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ `$PATH` Π² поисках Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΏΡ€Π°Π²ΠΎΠΌ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ встроСнныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. ВмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `type cd`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ сообщит `cd is a shell builtin`.

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ `which` ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΌΠ½Π΅, какая вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ установлСна?

НСт. `which` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ: `$(which python3) –version` ΠΈΠ»ΠΈ просто `python3 –version`. ΠŸΡƒΡ‚ΡŒ ΠΎΡ‚ `which` ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚Π΅ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

ΠŸΠΎΡ‡Π΅ΠΌΡƒ `which python3` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈ использовании `sudo`?

`sudo` выполняСт ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ root, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ `PATH` ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½, Ρ‡Π΅ΠΌ `PATH` ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π²Ρ€ΠΎΠ΄Π΅ `~/.local/bin` ΠΈΠ»ΠΈ ΠΏΡƒΡ‚ΠΈ nvm/pyenv, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² `.bashrc` ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² `PATH` ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root. ΠŸΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ выполнСния с ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ привилСгиями всСгда провСряйтС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `sudo which python3` ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

Доступна Π»ΠΈ `which` Π½Π° macOS?

Π”Π°, macOS Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ `which` ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ своСго ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ пространства, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ BSD. Однако вСрсия macOS Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„Π»Π°Π³ `-a` Π²ΠΎ всСх Π±ΠΎΠ»Π΅Π΅ старых вСрсиях. На соврСмСнных macOS с Homebrew Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн GNU `which` наряду с систСмной вСрсиСй. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `type -a which` Π½Π° macOS, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, какая рСализация Π°ΠΊΡ‚ΠΈΠ²Π½Π°.