БпСстСтС 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

β€œ`

ИзползванС Π² скриптовС Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° срСдата

На Dedicated ΡΡŠΡ€Π²ΡŠΡ€, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ с комплСксСн стСк ΠΎΡ‚ прилоТСния, скрипт Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ ΠΏΡ€ΠΈ стартиранС ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

β€œ`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, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ коя рСализация Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Π°.