Небольшая заметка на тему почему башизмы — это плохо (и когда нет).
Большинство почему-то (ошибочно) считает что Linux — это самая эталонная UNIX-like, и в виду его популярности оно отчасти верно, но Linux — не эталон.
Во-первых дистрибутивов очень, ОЧЕНЬ много, они все разные. И я не говорю о косметических (под косметическими я подразумеваю любые даже самые глобальные, но которые не ломают устройство и логику ОС в целом) изменениях.
Во-вторых не все идут с предустановленным Bash, и не везде он именно /bin/bash (на заметку любителям #!/bin/bash вместо /usr/bin/env bash). Многие подумали «Ну а в чём, собственно проблема? Просто установи его!», но не везде это возможно, где-то корпоративная политика запрещает устанавливать нерегламентированный софт, где-то это технически невозможно (например embedded с малым объёмом ROM, который зачастую ещё и только для чтения).
В-третьих в Bash появляются новые возможности а существующие изменяются. Это хорошо, но только не для скриптов, потому что невозможно гарантировать что на соседней машине даже с тем же дистрибутивом будет нужная версия, которая поддерживает используемые фичи.
Ну и наконец в-четвёртых кроме Linux существует ещё огромное множество UNIX-like (в том числе macOS, да), где его может не оказаться.
Но на этом приключения не заканчиваются! Даже в режиме совместимости (когда он является символической ссылкой в /bin/sh) Bash не ругается на башизмы. А башизмы, внезапно, работают только в Bash. Некоторые могут работать в другом шелле, но и это тоже никто не гарантирует. Высока вероятность (именно вероятность, потому что могут быть использованы утилиты, не имеющиеся на другой машине) что POSIX-совместимый шелл-скрипт будет работать с Bash, но bash-скрипт вряд ли будет корректно обработан POSIX-совместимым шеллом.
Конечно, это всё не актуально если скрипт подразумевает работу только на Linux (например обёртка над systemd или автоматизация iptables), но если пишется скрипт, который должен работать не на одной машине, и желательно не только в одной версии одного дистрибутива, стоит писать скрипты так, чтобы не переписывать их каждый раз когда их нужно запустить на другой машине (особенно актуально админам).
Взгляните на winetricks, который работает в Linux, FreeBSD и macOS (и, возможно, в других UNIX-like, где работает Wine).
Большинство почему-то (ошибочно) считает что Linux — это самая эталонная UNIX-like, и в виду его популярности оно отчасти верно, но Linux — не эталон.
Во-первых дистрибутивов очень, ОЧЕНЬ много, они все разные. И я не говорю о косметических (под косметическими я подразумеваю любые даже самые глобальные, но которые не ломают устройство и логику ОС в целом) изменениях.
Во-вторых не все идут с предустановленным Bash, и не везде он именно /bin/bash (на заметку любителям #!/bin/bash вместо /usr/bin/env bash). Многие подумали «Ну а в чём, собственно проблема? Просто установи его!», но не везде это возможно, где-то корпоративная политика запрещает устанавливать нерегламентированный софт, где-то это технически невозможно (например embedded с малым объёмом ROM, который зачастую ещё и только для чтения).
В-третьих в Bash появляются новые возможности а существующие изменяются. Это хорошо, но только не для скриптов, потому что невозможно гарантировать что на соседней машине даже с тем же дистрибутивом будет нужная версия, которая поддерживает используемые фичи.
Ну и наконец в-четвёртых кроме Linux существует ещё огромное множество UNIX-like (в том числе macOS, да), где его может не оказаться.
Но на этом приключения не заканчиваются! Даже в режиме совместимости (когда он является символической ссылкой в /bin/sh) Bash не ругается на башизмы. А башизмы, внезапно, работают только в Bash. Некоторые могут работать в другом шелле, но и это тоже никто не гарантирует. Высока вероятность (именно вероятность, потому что могут быть использованы утилиты, не имеющиеся на другой машине) что POSIX-совместимый шелл-скрипт будет работать с Bash, но bash-скрипт вряд ли будет корректно обработан POSIX-совместимым шеллом.
Конечно, это всё не актуально если скрипт подразумевает работу только на Linux (например обёртка над systemd или автоматизация iptables), но если пишется скрипт, который должен работать не на одной машине, и желательно не только в одной версии одного дистрибутива, стоит писать скрипты так, чтобы не переписывать их каждый раз когда их нужно запустить на другой машине (особенно актуально админам).
Взгляните на winetricks, который работает в Linux, FreeBSD и macOS (и, возможно, в других UNIX-like, где работает Wine).
• Правила форума
• [Новичкам] Как правильно задавать вопросы, чтобы Вам помогли
«Буду бить аккуратно, но сильно!» © Лёлик, х/ф «Бриллиантовая рука»
• [Новичкам] Как правильно задавать вопросы, чтобы Вам помогли
«Буду бить аккуратно, но сильно!» © Лёлик, х/ф «Бриллиантовая рука»