Плохая замена при запуске скрипта оболочки [duplicate]

Да: реализация Runnable - это предпочтительный способ сделать это, IMO. Вы не специализируетесь на поведении потока. Вы просто даете ему что-то бежать. Это означает, что композиция является философски «более чистым» способом.

В практических терминах это означает, что вы можете реализовать Runnable и перейти от другого класса.

909
задан Jason Gao 19 August 2016 в 01:45
поделиться

10 ответов

Другие ответы, как правило, указывали на разницу между Bash и стандартом оболочки POSIX. Однако при написании переносимых сценариев оболочки и использовании синтаксиса Bash список типичных bashisms и соответствующих чистых решений POSIX очень удобен. Такой список был скомпилирован, когда Ubuntu переключился с Bash на Dash в качестве системной оболочки по умолчанию и может быть найден здесь: https://wiki.ubuntu.com/DashAsBinSh

Кроме того, там это отличный инструмент под названием checkbashisms , который проверяет bashisms в вашем скрипте и подходит, когда вы хотите, чтобы ваш скрипт был переносимым.

14
ответ дан Andrzej Pronobis 18 August 2018 в 03:39
поделиться
  • 1
    Это в основном то, что мой ответ, как раз сейчас действительно сводится к минимуму. +1 – tripleee 8 March 2017 в 09:46

Сообщение из 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.
42
ответ дан Chaminda Bandara 18 August 2018 в 03:39
поделиться
  • 1
    Ваша таблица не полезна для меня, поскольку она пытается сравнить функции Bourne Shell и функции от ksh до 1988 года. Если вы действительно делаете таблицу за 1988 год, вам нужно будет удалить большинство других оболочек из этой таблицы, включая bash , sh и rc. Не могли бы вы объяснить, откуда вы взяли значения для своей таблицы? – schily 12 September 2015 в 20:43
  • 2
    Позвольте мне дать несколько советов: «Управление заданиями» была добавлена ​​в Bourne Shell в 1989 году, а Bourne Shell была выпущена OpenSource в 2005 году. Оболочка Korn имеет замену процесса с 1988 года и является OpenSource с 1997 года. BTW: ваши заявления относительно $ ENV неверны, $ ENV только считывается / выполняется для интерактивных оболочек. – schily 12 September 2015 в 20:47
  • 3
    @schily Это сообщение было снято с cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html – SriniV 14 September 2015 в 05:35
  • 4
    @schily Если вы считаете, что это некорректно в любом месте, не стесняйтесь редактировать его соответствующим образом. – SriniV 14 September 2015 в 05:36
  • 5
    Основываясь на том, что может показаться схотливым, казалось бы, было бы лучше удалить этот ответ, поскольку он по сути является мошенническим, и ОП не действительно проверил информацию, которую он вставлял. – danstermeister 17 October 2015 в 00:12

sh: http://man.cx/sh bash: http://man.cx/bash

TL; DR: bash является надмножеством sh с более элегантным синтаксисом и большей функциональностью. Безопасно использовать линию bash shebang почти во всех случаях, поскольку она довольно распространена на современных платформах.

NB: в некоторых средах sh есть bash. Проверьте sh --version.

85
ответ дан haccks 18 August 2018 в 03:39
поделиться
  • 1
    если bash вызывается как sh, он ведет себя по-другому. См. gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files («Вызывается с именем sh») и gnu.org/software/bash/manual/ bashref.html # Баш-POSIX-режим . Например, нет замены процесса. – glenn jackman 20 April 2011 в 05:12
  • 2
    Поскольку bash является надмножеством sh, и некоторые ОС, такие как FreeBSD, не имеют bash, установленных по умолчанию, скрипты в sh будут иметь большую переносимость. – user674062 20 April 2011 в 06:49
  • 3
    Поскольку нет портативного сценария для получения оболочки POSIX для определенного скрипта, переносные скрипты не могут принимать больше, чем функции Bourne Shell. – schily 12 September 2015 в 21:34
  • 4
    В Ubuntu 16.04.3 LTS команда sh -version завершается с ошибкой. – Argent 18 December 2017 в 10:56

/bin/sh может вызвать или не вызывать ту же программу, что и /bin/bash.

sh поддерживает не менее функции , требуемые POSIX (при условии правильной реализации). Он также может поддерживать расширения.

bash, «Bourne Again Shell», реализует функции, необходимые для расширений sh plus bash. Полный набор расширений слишком длинный для описания здесь, и он отличается от новых выпусков. Различия описаны в руководстве bash. Введите info bash и прочитайте раздел «Bash Features» (раздел 6 в текущей версии) или прочитайте текущую документацию в Интернете .

3
ответ дан Keith Thompson 18 August 2018 в 03:39
поделиться
  • 1
    sh дает вам только оболочку POSIX, если у вас есть право PATH, установленное в вашей текущей оболочке. Не существует определенного PATH-имени, которое дает вам оболочку POSIX. – schily 12 September 2015 в 21:37
  • 2
    Долгое время sh не обязательно even , предоставляя вам оболочку 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:

  • Shell - это интерфейс или спецификации или API.
  • sh - это класс, который реализует интерфейс Shell.
  • Bash - это подкласс sh.
21
ответ дан Premraj 18 August 2018 в 03:39
поделиться
  • 1
    Я не понимаю. Вы упомянули, что оба «Bash - это суперсет sh». и «Bash является подклассом sh», не являются ли они противоположными утверждениями? Не могли бы вы прояснить? – Keerthana Prabhakaran 26 April 2018 в 06:13
  • 2
    Я думаю, что это пытается сказать, что Bash наследует от 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 без изменений и также предоставлять функции редактирования строк команд.

0
ответ дан rashedcs 18 August 2018 в 03:39
поделиться

Что такое sh

sh (или командный язык командной оболочки) - это язык программирования, описанный стандартом POSIX . Он имеет множество реализаций (ksh88, dash, ...). bash также можно рассматривать как реализацию sh (см. ниже).

Поскольку sh является спецификацией, а не реализацией, /bin/sh является символической ссылкой (или жесткой ссылкой) на фактическая реализация на большинстве систем POSIX.

Что такое bash

bash началось как sh -совместимая реализация (хотя она предшествует стандарту POSIX на несколько лет) но со временем он приобрел много расширений. Многие из этих расширений могут изменять поведение действительных сценариев оболочки POSIX, поэтому сам по себе bash не является допустимой оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.

bash поддерживает переключатель --posix, что делает его более совместимым с POSIX. Он также пытается имитировать POSIX, если он вызван как sh.

sh = bash?

Долгое время /bin/sh указывал на /bin/bash на большинстве GNU / Linux. В результате было почти безопасно игнорировать разницу между ними. Но в последнее время это изменилось.

Некоторые популярные примеры систем, в которых /bin/sh не указывают на /bin/bash (а некоторые из которых /bin/bash могут даже не существовать):

  1. Современные системы Debian и Ubuntu, по умолчанию символьные sh по dash;
  2. Busybox , который обычно запускается во время загрузки системы Linux как часть initramfs. Он использует реализацию оболочки ash.
  3. BSD и вообще любые системы, отличные от Linux. OpenBSD использует 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 line

В конечном счете, вам решать, какой из них использовать, написав строку «shebang».

Например,

#!/bin/sh

будет использовать sh (и все, что происходит с точкой),

#!/bin/bash

будет использовать /bin/bash, если он доступен (и сбой с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например

#!/bin/dash

Какой из них использовать

Для моих собственных сценариев я предпочитаю sh по следующим причинам:

  • стандартизировано
  • намного проще и легче учиться
  • , оно переносится через системы POSIX - даже если они не имеют bash, они должны иметь sh

. Есть также преимущества использования bash. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие области, как локальные переменные и массивы. Обычный sh - очень минималистический язык программирования.

858
ответ дан Roman Cheplyaka 18 August 2018 в 03:39
поделиться
  • 1
    Вероятно, это означает, что они указывают /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
  • 2
    Спасибо за отличное объяснение! Для справки, sh! = Bash на MacOS. – bizi 5 October 2014 в 07:28
  • 3
    На практике почти каждая реализация sh поддерживает локальные переменные, объявленные с ключевым словом local. – August Karlstrom 17 November 2014 в 07:35
  • 4
    @bizi Korays-MacBook-Pro: hello2 koraytugay $ sh --version GNU bash, версия 3.2.57 (1) -release (x86_64-apple-darwin14) Copyright (C) 2007 Free Software Foundation, Inc. Korays-MacBook-Pro : hello2 koraytugay $ bash --version GNU bash, версия 3.2.57 (1) -release (x86_64-apple-darwin14) Copyright (C) 2007 Free Software Foundation, Inc. – Koray Tugay 11 April 2015 в 17:36
  • 5
    @IanTait Вместо 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.

2
ответ дан Srinivasulu Chinna 18 August 2018 в 03:39
поделиться

TERMINAL

  • программа, которая помещает окно вверх
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm и eterm.

SHELL

  • Является ли программа, которая работает в терминале
  • Shell является командным интерпретатором и языком программирования
  • Shell - это просто макропроцессор, который выполняет команды.
  • Макропроцессор означает функциональность, где текст и символы расширены, чтобы создавать более крупные выражения.

SH Vs. BASH

SH

  • (SHell)
  • Является конкретной оболочкой
  • командным интерпретатором и языком программирования
  • Предшественник BASH

BASH

  • (Bourne-Again SHell)
  • Является конкретной оболочкой
  • командный интерпретатор и язык программирования
  • Имеет смысл и больше
  • Преемник SH
  • BASH является SHELL
  • по умолчанию

СПРАВОЧНЫЙ МАТЕРИАЛ:

SHELL gnu.org:

В своей базе оболочка - это просто макропроцессор, который выполняет команды. Термин макропроцессор означает функциональность, в которой текст и символы расширены, чтобы создавать более крупные выражения.

Оболочка Unix - это командный интерпретатор и язык программирования. В качестве интерпретатора команд оболочка предоставляет пользовательский интерфейс для богатого набора утилит GNU. Функции языка программирования позволяют объединить эти утилиты. Файлы, содержащие команды, могут быть созданы и сами становятся командами. Эти новые команды имеют тот же статус, что и системные команды в каталогах, таких как / bin, что позволяет пользователям или группам создавать настраиваемые среды для автоматизации своих общих задач.

Оболочки могут использоваться интерактивно или не интерактивно. В интерактивном режиме они принимают ввод, введенный с клавиатуры. При выполнении неинтерактивно оболочки запускают команды, считанные из файла.

Оболочка позволяет выполнять команды GNU синхронно и асинхронно. Оболочка ждет завершения синхронных команд, прежде чем принимать больше ввода; асинхронные команды продолжают выполняться параллельно с оболочкой, когда она читает и выполняет дополнительные команды. Конструкции перенаправления допускают мелкозернистый контроль ввода и вывода этих команд. Кроме того, оболочка позволяет контролировать содержимое среды команд.

Корпуса также предоставляют небольшой набор встроенных команд (встроенных функций), реализующих функциональность, невозможную или неудобную для получения через отдельные утилиты. Например, cd, break, continue и exec не могут быть реализованы за пределами оболочки, потому что они непосредственно манипулируют самой оболочкой. Истории, getopts, kill или pwd builtins, среди прочих, могут быть реализованы в отдельных утилитах, но их удобнее использовать в качестве встроенных команд. Все встроенные оболочки описаны в следующих разделах.

При выполнении команд важно, большая часть мощности (и сложности) оболочек связана с их встроенными языками программирования. Как и любой язык высокого уровня, оболочка предоставляет переменные, конструкции управления потоком, кавычки и функции.

Корпуса предлагают функции, специально предназначенные для интерактивного использования, а не для расширения языка программирования. Эти интерактивные функции включают управление заданиями, редактирование командной строки, историю команд и псевдонимы. Каждая из этих функций описана в этом руководстве.

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 существуют независимые порты.

20
ответ дан Timothy L.J. Stewart 18 August 2018 в 03:39
поделиться

Этот вопрос часто был номинирован как канонический для людей, которые пытаются использовать 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 не имеет массивов.
  • Некоторые ключевые слова Bash, такие как local, function и select, не переносимы на sh.
  • У Bash множество расширений синтаксиса C-стиля, таких как $'string\nwith\tC\aescapes' и три аргумента for((i=0;i<=3;i++)), [increment assign] += и т. д.
  • Bash поддерживает <<<'here strings'.
  • У Bash есть расширение *.{png,jpg} и {0..9}.
  • ~ относится к $HOME только в Bash (и, в более общем смысле, ~username в домашний каталог username).
  • У Bash есть замещение процесса с помощью <(cmd) и >(cmd).
  • Bash поддерживает сопроцессы с перенаправлением <>.
  • Bash значительно расширенный ities для арифметики оболочки (хотя и не поддерживающей с плавающей запятой) и манипуляции с переменной подстрокой с помощью ${substring:1:2}, ${variable/pattern/replacement}, преобразования case и т. д.
  • Многие, многие расширения Bash для включения или отключения необязательных поведение и разоблачение внутреннего состояния оболочки.
  • Множество удобных функций для интерактивного использования, которые, однако, не влияют на поведение скриптов.

Помните, что это сокращенный список , Обратитесь к справочному руководству для полного совка и 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.

33
ответ дан tripleee 18 August 2018 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: