Я ветеран кукурузной шелухи, так что знайте, что я говорю с этой точки зрения.
Тем не менее, мне было комфортно с оболочкой Bourne, ksh88 и ksh93, и большинство из них я знаю, какие функции в каких поддерживаются. (Здесь я должен пропустить ksh88, так как он больше не распространен.)
Для интерактивного использования берите все, что вам нужно. Эксперимент. Мне нравится использовать одну и ту же оболочку для интерактивного использования и для программирования.
Я перешел с ksh88 на SVR2 на tcsh, на ksh88sun (который добавил значительную поддержку интернационализации) и на ksh93. Я пробовал bash и ненавидел его, потому что он сглаживал мою историю. Затем я обнаружил shopt -s lithist, и все было хорошо. (Опция lithist гарантирует, что символы новой строки сохраняются в вашей истории команд.)
Для программирования оболочки я бы серьезно рекомендовал ksh93, если вам нужен согласованный язык программирования, хорошее соответствие POSIX и хорошая производительность, поскольку многие распространенные команды unix могут быть доступны как встроенные функции.
Если вам нужна переносимость, используйте как минимум оба. И убедитесь, что у вас есть хороший набор тестов.
Между оболочками есть много тонких различий. Рассмотрим, например, чтение из канала:
b=42 && echo one two three four |
read a b junk && echo $b
Это даст разные результаты в разных оболочках. Корн-шелл проходит трубопроводы сзади вперед; последний элемент в конвейере выполняется в текущем процессе. Bash не поддерживал это полезное поведение до v4.x, и даже тогда это не было по умолчанию.
Другой пример, иллюстрирующий согласованность: сама команда echo, которая устарела из-за разделения BSD и SYSV unix, и каждая из них ввела свое собственное соглашение о непечатании новых строк (и другом поведении). Результат этого все еще можно увидеть во многих сценариях настройки.
Ksh применил радикальный подход к этому - и представил команду print, которая на самом деле поддерживает оба метода (опция -n из BSD и завершающий специальный символ \c из SYSV)
Однако для серьезного системного программирования я бы рекомендовал что-то другое, кроме оболочки, например, python, perl. Или сделайте еще один шаг и используйте такую платформу, как puppet, которая позволяет вам наблюдать и исправлять состояние целых кластеров систем с хорошим аудитом.
Программирование оболочки похоже на плавание в неизведанных водах, если не хуже.
Программирование на любом языке требует знакомства с его синтаксисом, интерфейсами и поведением. Программирование оболочки ничем не отличается.
person
Henk Langeveld
schedule
02.04.2011