ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° `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, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΅ Π°ΠΊΡΠΈΠ²Π½Π°.
ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΡΠΈΠ½Π³ ΡΡΠ»ΡΠ³ΠΈ