
Brush Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Rust, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ΅ΡΠ°Π²Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ POSIX ΠΈ Bash Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. ΠΡΠΎΠ΅ΠΊΡΡΡ Π΅ Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ ΡΠΎΠ²Π° Π΄Π° ΡΡΠ°Π½Π΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ shell-ΠΎΠ²Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° .bashrc ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. Π’Π°Π·ΠΈ Π²Π΅ΡΡΠΈΡ Π΅ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΠΈ Π½Π°Π΄ 200 ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ pull request-Π°, Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°ΠΏΡΠ΅Π΄Π²Π°ΠΉΠΊΠΈ Π² ΠΏΡΠ°Π²Π΅Π½Π΅ΡΠΎ Π½Π° shell, ΠΊΠΎΠΉΡΠΎ Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈ Bash ΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Ρ POSIX ΡΡΠ΅Π΄ΠΈ.
ΠΡΠ½ΠΎΠ²Π½ΠΈ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π½Π° ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ Π² ΡΠΎΠ·ΠΈ ΡΠ΅Π»ΠΈΠ·:
- ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Bash: Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ set -e, set -u, pipefail, failglob, ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ERR, ΡΠΎΠΏΡΠΎΡΠ΅ΡΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ;
- Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡ: ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΈ ΡΠ»ΡΡΠ°ΠΈ β Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ, ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ ΠΈΠ·Ρ ΠΎΠ΄, Π½Π΅-UTF8 ΠΈΡΡΠΎΡΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈ;
- ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ: ΡΠ°Π·ΡΠΈΡΠ΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° macOS (ΡΠ°Π±ΠΎΡΠ° ΠΊΠ°ΡΠΎ Π²Π»ΠΈΠ·Π°Π½Π΅ shell), ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° Windows, FreeBSD, Android ΠΈ 32-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ;
- ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΡΡ: Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»Π½ΠΈ TOML ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, preexec/precmd Ρ ΡΠΊΠΎΠ²Π΅, ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈ ΠΎΡ readline ΠΈ Π΄ΡΡΠ³ΠΎ.
ΠΠ»ΡΡΠΎΠ²ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Bash ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ°
ΠΠ°ΠΉ-Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠΎΠ·ΠΈ ΡΠ΅Π»ΠΈΠ· ΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎΡΠΎ ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Bash. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈΡΠ΅:
- set -e (errexit) β Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΈΠ·Π»ΠΈΠ·Π°Π½Π΅ ΠΏΡΠΈ Π³ΡΠ΅ΡΠΊΠ°;
- set -u (nounset) β Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°;
- pipefail β ΠΊΠΎΠ΄ΡΡ Π½Π° Π²ΡΡΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π½Π΅ΡΡΠΏΠ΅ΡΠ½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°;
- failglob β ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π·Π° glob-ΠΈΠ·ΡΠ°Π· ΡΠ΅Π³Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠ°.
ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ (Traps) ΠΈ ΡΠΎΠΏΡΠΎΡΠ΅ΡΠΈ:
- ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ERR β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΏΡΠΈ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ°;
- ΡΠΎΠΏΡΠΎΡΠ΅ΡΠΈ (coproc) β ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΠ½ΠΎΠ²ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ Ρ Π΄Π²ΡΠΏΠΎΡΠΎΡΠ½Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ.
ΠΠ³ΡΠ°Π΄Π΅Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
- ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ½ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΈ Ρ Π²ΠΈΡΠΎΠΊΠ° ΠΎΡΠ½ΠΎΠ²Π°, ΠΏΡΠ΅Π»ΠΈΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ Π·Π° ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅;
- ΠΏΠΎΠΏΡΠ°Π²ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²Π°Ρ Π½Π° Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ: caller, read, getopts, printf ΠΈ Π΄ΡΡΠ³ΠΈ.
Π Π°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ:
Π Π΅Π»ΠΈΠ· v0.4.0 ΠΏΡΠ°Π²ΠΈ shell-Π° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° ΠΏΠΎ-ΡΠΈΡΠΎΠΊ ΡΠΏΠ΅ΠΊΡΡΡ ΠΎΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°:
- macOS: ΠΏΠΎΠΏΡΠ°Π²Π΅Π½Π° Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΡΠ΅ Π·Π°ΠΌΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° shell-Π° ΠΏΡΠΈ Π»ΠΎΠ³Π²Π°Π½Π΅. Π‘Π΅Π³Π° brush ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ Π²Π»ΠΈΠ·Π°Π½Π΅ shell (login shell);
- Windows: ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΡΠΈΡΠ°, Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π΅ΠΌΡΠ»ΡΡΠΈΡ Π½Π° /dev/null, ΠΊΠΎΠ΅ΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Windows;
- FreeBSD ΠΈ Android: Π½Π°Π»ΠΈΡΠ΅Π½ Π±ΠΈΠ»Π΄ Π·Π° ΡΠ΅Π·ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ;
ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ API
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ: Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΎΠΏΡΠΈΠΎΠ½Π°Π»Π΅Π½ TOML ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» (~/.config/brush/config.toml) Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° brush;
- ΠΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅: ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ° zsh ΡΡΠΈΠ»ΠΎΠ²Π΅ preexec/precmd Ρ ΡΠΊΠΎΠ²Π΅ (Ρ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ ΡΠ»Π°Π³), ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠΊΠ°Π½ΠΈ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅;
- API Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ: ΡΠΈΠΏ Shell Π²Π΅ΡΠ΅ Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΈΡΠ°Π½ Ρ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ (ShellExtensions), ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΉΠΊΠΈ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠ°Π·ΠΊΠ»ΠΎΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°;
- Π Π°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ:
- Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° AST ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ° ΡΡΠ΅Π· serde;
- ΡΠ΅Π³Π° Π² brush-parser ΠΈ brush-core ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° serde Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° AST ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru
