Да: реализация Runnable
- это предпочтительный способ сделать это, IMO. Вы не специализируетесь на поведении потока. Вы просто даете ему что-то бежать. Это означает, что композиция является философски «более чистым» способом.
В практических терминах это означает, что вы можете реализовать Runnable
и перейти от другого класса.
Другие ответы, как правило, указывали на разницу между Bash и стандартом оболочки POSIX. Однако при написании переносимых сценариев оболочки и использовании синтаксиса Bash список типичных bashisms и соответствующих чистых решений POSIX очень удобен. Такой список был скомпилирован, когда Ubuntu переключился с Bash на Dash в качестве системной оболочки по умолчанию и может быть найден здесь: https://wiki.ubuntu.com/DashAsBinSh
Кроме того, там это отличный инструмент под названием checkbashisms , который проверяет bashisms в вашем скрипте и подходит, когда вы хотите, чтобы ваш скрипт был переносимым.
Сообщение из UNIX.COM
Свойства оболочки
В приведенной ниже таблице перечислены большинство функций, которые, я думаю, заставят вас выбрать одну оболочку поверх другой. Он не предназначен для окончательного списка и не включает каждую возможную функцию для каждой возможной оболочки. Функция считается только в оболочке, если в версии, поставляемой с операционной системой, или если она доступна, как скомпилированная непосредственно из стандартного дистрибутива. В частности, указанная ниже оболочка C - это доступная на SUNOS 4. *, значительное количество поставщиков теперь отправляет либо tcsh, либо свою собственную расширенную оболочку C вместо этого (они не всегда делают очевидным, что они отправляют tcsh.
Код:
sh csh ksh bash tcsh zsh rc es
Job control N Y Y Y Y Y N N
Aliases N Y Y Y Y Y N N
Shell functions Y(1) N Y Y N Y Y Y
"Sensible" Input/Output redirection Y N Y Y N Y Y Y
Directory stack N Y Y Y Y Y F F
Command history N Y Y Y Y Y L L
Command line editing N N Y Y Y Y L L
Vi Command line editing N N Y Y Y(3) Y L L
Emacs Command line editing N N Y Y Y Y L L
Rebindable Command line editing N N N Y Y Y L L
User name look up N Y Y Y Y Y L L
Login/Logout watching N N N N Y Y F F
Filename completion N Y(1) Y Y Y Y L L
Username completion N Y(2) Y Y Y Y L L
Hostname completion N Y(2) Y Y Y Y L L
History completion N N N Y Y Y L L
Fully programmable Completion N N N N Y Y N N
Mh Mailbox completion N N N N(4) N(6) N(6) N N
Co Processes N N Y N N Y N N
Builtin artithmetic evaluation N Y Y Y Y Y N N
Can follow symbolic links invisibly N N Y Y Y Y N N
Periodic command execution N N N N Y Y N N
Custom Prompt (easily) N N Y Y Y Y Y Y
Sun Keyboard Hack N N N N N Y N N
Spelling Correction N N N N Y Y N N
Process Substitution N N N Y(2) N Y Y Y
Underlying Syntax sh csh sh sh csh sh rc rc
Freely Available N N N(5) Y Y Y Y Y
Checks Mailbox N Y Y Y Y Y F F
Tty Sanity Checking N N N N Y Y N N
Can cope with large argument lists Y N Y Y Y Y Y Y
Has non-interactive startup file N Y Y(7) Y(7) Y Y N N
Has non-login startup file N Y Y(7) Y Y Y N N
Can avoid user startup files N Y N Y N Y Y Y
Can specify startup file N N Y Y N N N N
Low level command redefinition N N N N N N N Y
Has anonymous functions N N N N N N Y Y
List Variables N Y Y N Y Y Y Y
Full signal trap handling Y N Y Y N Y Y Y
File no clobber ability N Y Y Y Y Y N F
Local variables N N Y Y N Y Y Y
Lexically scoped variables N N N N N N N Y
Exceptions N N N N N N N Y
Ключ к таблице выше.
Y Функция может быть выполнена с использованием этой оболочки.
N Функция отсутствует в оболочке.
F Функция может быть выполнена только с помощью механизма функций оболочки.
L Библиотека readline должна быть связана с оболочкой, чтобы включить эту функцию.
Примечания к таблице выше
1. This feature was not in the original version, but has since become
almost standard.
2. This feature is fairly new and so is often not found on many
versions of the shell, it is gradually making its way into
standard distribution.
3. The Vi emulation of this shell is thought by many to be
incomplete.
4. This feature is not standard but unofficial patches exist to
perform this.
5. A version called 'pdksh' is freely available, but does not have
the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
sh
: http://man.cx/sh bash
: http://man.cx/bash
TL; DR: bash
является надмножеством sh
с более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.
NB: в некоторых средах sh
есть bash
. Проверьте sh --version
.
/bin/sh
может вызвать или не вызывать ту же программу, что и /bin/bash
.
sh
поддерживает не менее функции , требуемые POSIX (при условии правильной реализации). Он также может поддерживать расширения.
bash
, «Bourne Again Shell», реализует функции, необходимые для расширений sh plus bash. Полный набор расширений слишком длинный для описания здесь, и он отличается от новых выпусков. Различия описаны в руководстве bash. Введите info bash
и прочитайте раздел «Bash Features» (раздел 6 в текущей версии) или прочитайте текущую документацию в Интернете .
sh
дает вам только оболочку POSIX, если у вас есть право PATH
, установленное в вашей текущей оболочке. Не существует определенного PATH-имени, которое дает вам оболочку POSIX.
– schily
12 September 2015 в 21:37
sh
не обязательно even i>, предоставляя вам оболочку POSIX, например, в Solaris.
– tripleee
14 April 2016 в 04:19
Shell - это интерфейс между пользователем и ОС для доступа к службам операционной системы. Это может быть интерфейс GUI или CLI (интерфейс командной строки).
sh (оболочка Bourne) - интерпретатор командной строки оболочки для Unix / Unix-подобных операционных систем. Он предоставляет некоторые встроенные команды. В языке сценариев мы обозначаем интерпретатор как #!/bin/sh
. Он был наиболее широко поддержан другими оболочками, такими как bash (free / open), kash (не бесплатно).
Bash (Bourne again shell) - замена оболочки для оболочки Bourne. Баш - это надмножество sh. Bash поддерживает sh. POSIX - это набор стандартов, определяющих совместимость POSIX-систем. Bash на самом деле не является совместимой с POSIX оболочкой. На языке сценариев мы обозначаем интерпретатор как #!/bin/bash
.
Analogy:
sh
(так что это «подкласс» в смысле ООП) и расширяет его (так что имеет надмножество функциональности).
– tripleee
19 May 2018 в 04:44
Операционная система Linux предлагает различные типы оболочек. Хотя оболочки имеют много общих команд, каждый тип имеет уникальные функции. Давайте рассмотрим различные типы используемых в основном оболочек.
Sh shell:
Sh shell также известна как Bourne Shell. Sh shell - первая оболочка, разработанная для компьютеров Unix Stephen Bourne в AT & amp; T's Bell Labs в 1977 году. Она включает в себя множество инструментов для написания сценариев.
Bash shell:
Bash shell обозначает Bourne Снова Shell. Оболочка Bash является оболочкой по умолчанию в большинстве дистрибутивов Linux и заменяет Sh Shell (Sh shell также будет работать в оболочке Bash). Bash Shell может выполнять подавляющее большинство скриптов Sh shell без изменений и также предоставлять функции редактирования строк команд.
sh
(или командный язык командной оболочки) - это язык программирования, описанный стандартом POSIX . Он имеет множество реализаций (ksh88
, dash
, ...). bash
также можно рассматривать как реализацию sh
(см. ниже).
Поскольку sh
является спецификацией, а не реализацией, /bin/sh
является символической ссылкой (или жесткой ссылкой) на фактическая реализация на большинстве систем POSIX.
bash
началось как sh
-совместимая реализация (хотя она предшествует стандарту POSIX на несколько лет) но со временем он приобрел много расширений. Многие из этих расширений могут изменять поведение действительных сценариев оболочки POSIX, поэтому сам по себе bash
не является допустимой оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.
bash
поддерживает переключатель --posix
, что делает его более совместимым с POSIX. Он также пытается имитировать POSIX, если он вызван как sh
.
Долгое время /bin/sh
указывал на /bin/bash
на большинстве GNU / Linux. В результате было почти безопасно игнорировать разницу между ними. Но в последнее время это изменилось.
Некоторые популярные примеры систем, в которых /bin/sh
не указывают на /bin/bash
(а некоторые из которых /bin/bash
могут даже не существовать):
sh
по dash
; initramfs
. Он использует реализацию оболочки ash
. pdksh
, потомок оболочки Korn. FreeBSD sh
является потомком исходной оболочки UNIX Bourne. Solaris имеет свой собственный sh
, который долгое время не был совместим с POSIX; свободная реализация доступна из проекта Heirloom . Как вы можете узнать, что указывает /bin/sh
на вашу систему?
Усложнение состоит в том, что /bin/sh
может быть символической ссылкой или жесткой ссылкой. Если это символическая ссылка, способ portable для ее устранения:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Если это жесткая ссылка, попробуйте
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Фактически , флаг -L
охватывает как символические ссылки, так и жесткие ссылки, но недостатком этого метода является то, что он не переносимый - POSIX не требует find
для поддержки опции -samefile
, хотя оба GNU find и FreeBSD find поддерживают его.
В конечном счете, вам решать, какой из них использовать, написав строку «shebang».
Например,
#!/bin/sh
будет использовать sh
(и все, что происходит с точкой),
#!/bin/bash
будет использовать /bin/bash
, если он доступен (и сбой с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например
#!/bin/dash
Для моих собственных сценариев я предпочитаю sh
по следующим причинам:
bash
, они должны иметь sh
. Есть также преимущества использования bash
. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие области, как локальные переменные и массивы. Обычный sh
- очень минималистический язык программирования.
/bin/tcsh
как интерактивную оболочку по умолчанию в /etc/passwd
, но не используют tcsh
в качестве реализации sh
. tcsh
имеет синтаксис оболочки C; он даже не удаленно совместим со стандартом sh POSIX. См. freebsd.org/cgi/man.cgi?query=sh&sektion=1 для описания FreeBSD sh
.
– Roman Cheplyaka
14 April 2014 в 11:49
sh
поддерживает локальные переменные, объявленные с ключевым словом local
.
– August Karlstrom
17 November 2014 в 07:35
STR =~ REGEX
вы можете использовать echo STR | grep -q REGEX
.
– August Karlstrom
10 February 2017 в 09:46
Bash (bash) - одна из многих доступных (но наиболее часто используемых) оболочек Unix. Bash означает «Bourne Again SHell» и является заменой / улучшением оригинальной оболочки Bourne (sh).
Сценарий оболочки написан скриптом в любой оболочке, тогда как сценарий Bash написан скриптом специально для Bash.
TERMINAL
SHELL
SH Vs. BASH
SH
BASH
СПРАВОЧНЫЙ МАТЕРИАЛ:
SHELL gnu.org:
В своей базе оболочка - это просто макропроцессор, который выполняет команды. Термин макропроцессор означает функциональность, в которой текст и символы расширены, чтобы создавать более крупные выражения.
Оболочка Unix - это командный интерпретатор и язык программирования. В качестве интерпретатора команд оболочка предоставляет пользовательский интерфейс для богатого набора утилит GNU. Функции языка программирования позволяют объединить эти утилиты. Файлы, содержащие команды, могут быть созданы и сами становятся командами. Эти новые команды имеют тот же статус, что и системные команды в каталогах, таких как / bin, что позволяет пользователям или группам создавать настраиваемые среды для автоматизации своих общих задач.
Оболочки могут использоваться интерактивно или не интерактивно. В интерактивном режиме они принимают ввод, введенный с клавиатуры. При выполнении неинтерактивно оболочки запускают команды, считанные из файла.
Оболочка позволяет выполнять команды GNU синхронно и асинхронно. Оболочка ждет завершения синхронных команд, прежде чем принимать больше ввода; асинхронные команды продолжают выполняться параллельно с оболочкой, когда она читает и выполняет дополнительные команды. Конструкции перенаправления допускают мелкозернистый контроль ввода и вывода этих команд. Кроме того, оболочка позволяет контролировать содержимое среды команд.
Корпуса также предоставляют небольшой набор встроенных команд (встроенных функций), реализующих функциональность, невозможную или неудобную для получения через отдельные утилиты. Например, cd, break, continue и exec не могут быть реализованы за пределами оболочки, потому что они непосредственно манипулируют самой оболочкой. Истории, getopts, kill или pwd builtins, среди прочих, могут быть реализованы в отдельных утилитах, но их удобнее использовать в качестве встроенных команд. Все встроенные оболочки описаны в следующих разделах.
При выполнении команд важно, большая часть мощности (и сложности) оболочек связана с их встроенными языками программирования. Как и любой язык высокого уровня, оболочка предоставляет переменные, конструкции управления потоком, кавычки и функции.
Корпуса предлагают функции, специально предназначенные для интерактивного использования, а не для расширения языка программирования. Эти интерактивные функции включают управление заданиями, редактирование командной строки, историю команд и псевдонимы. Каждая из этих функций описана в этом руководстве.
blockquote>BASH gnu.org:
Bash - это оболочка или команда переводчик языка, для операционной системы GNU. Это аббревиатура для «Bourne-Again SHell», каламбура Стивена Борна, автора прямого предка текущей оболочки Unix sh, которая появилась в седьмой версии Bell Labs Research версии Unix.
Bash в значительной степени совместим с sh и включает полезные функции из оболочки ksh ksh и оболочки csh c. Предполагается, что это будет совместимая реализация части IEEE POSIX Shell и инструментов спецификации IEEE POSIX (стандарт IEEE 1003.1).
В то время как операционная система GNU предоставляет другие оболочки, включая версию csh, Bash является оболочкой по умолчанию. Как и в других программах GNU, Bash довольно портативен. В настоящее время он работает практически со всеми версиями Unix и несколькими другими операционными системами. Для платформ MS-DOS, OS / 2 и Windows существуют независимые порты.
blockquote>
Этот вопрос часто был номинирован как канонический для людей, которые пытаются использовать sh
, и удивляются, что он не ведет себя так же, как bash
. Вот краткое описание распространенных недоразумений и ошибок.
Во-первых, вы должны понимать, чего ожидать.
sh scriptname
или запустите его с scriptname
и #!/bin/sh
в строке shebang , вы должны ожидать поведение POSIX sh
. bash scriptname
или запустите его с scriptname
и иметь #!/bin/bash
(или локальный эквивалент) в строке shebang, вы должны ожидать поведения Bash. Имея правильный shebang и запуская скрипт, набрав только скрипт имя (возможно, с относительным или полным путем), как правило, является предпочтительным решением. В дополнение к правильному shebang для этого требуется, чтобы файл сценария имел разрешение на выполнение (chmod a+x scriptname
).
Итак, как они на самом деле отличаются?
Справочное руководство Bash содержит , который пытается перечислить различия , но некоторые общие источники путаницы включают
[[
, недоступны в sh
(только [
, который является более неуклюжим и ограничено). sh
не имеет массивов. local
, function
и select
, не переносимы на sh
. $'string\nwith\tC\aescapes'
и три аргумента for((i=0;i<=3;i++))
, [increment assign] +=
и т. д. <<<'here strings'
. *.{png,jpg}
и {0..9}
. ~
относится к $HOME
только в Bash (и, в более общем смысле, ~username
в домашний каталог username
). <(cmd)
и >(cmd)
. <>
. ${substring:1:2}
, ${variable/pattern/replacement}
, преобразования case и т. д. Помните, что это сокращенный список , Обратитесь к справочному руководству для полного совка и http://mywiki.wooledge.org/Bashism для многих хороших обходных решений; и / или попробуйте http://shellcheck.net/ , который предупреждает обо всех возможностях Bash.
Общей ошибкой является наличие строки #!/bin/bash
shebang, но затем тем не менее, используя sh scriptname
для фактического запуска скрипта. Это в основном отключает любую функцию Bash-only, поэтому вы получаете синтаксические ошибки, например. для попытки использования массивов.
К сожалению, Bash не будет предупреждать, когда вы пытаетесь использовать эти конструкции, когда он вызывается как sh
. Это не полностью отключает все функции Bash-only, так что запуск Bash путем вызова его как sh
не является хорошим способом проверить, правильно ли ваш сценарий переносится на ash
/ dash
/ POSIX sh
.