В чем разница между использованием bash и sh для выполнения сценария?

Вы можете заставить столбцы выстроиться в линию, выполнив

# fcinfo hba-port | awk '
                        BEGIN {printf("HBA_Manufacturer Firmware_Version State\n")
                               printf("---------------- ---------------- -----\n")
                              }
                        /Manufacturer:/ {m=$2}
                        /Firmware Version:/ {F=$3}
                        /State/ {print m, F, $2}' | column -t

Это даст результат, подобный

HBA_Manufacturer  Firmware_Version  State
----------------  ----------------  -----
Emulex            2.82a4            online
Emulex            2.82a4            online
Emulex            2.82a4            offline
Emulex            2.82a4            offline
Emulex            2.82a4            online
Emulex            2.82a4            online

Примечания:

  • Если вам нужно больше пространства между столбцами, используйте опцию --output-separator string (или -o string) в конце, чтобы указать строку, которую нужно поместить между колонками. По умолчанию используется два пробела; например, ...| column -t -o " " (с четырьмя пробелами) даст вам что-то более близкое к тому. к показанному вами примеру.
  • В показанном вами примере после заголовков идет непрерывный ряд тире после заголовков.  Моя команда, как показано выше, даст только короткий ряд тире под каждым заголовком.  Это становится еще более очевидным, если некоторые из ваших данных длиннее:

    HBA_Manufacturer Firmware_Version State
    ---------------- ---------------- -----
    Emulex 2.82a4 онлайн
    Emulex 2.82a4 online
    Какой-то_другой_производитель 2.82a4 offline
    Emulex 2.82a4 offline
    Emulex 2.82a4 online
    Emulex 2.82a4 online
    

    Это можно исправить, если необходимо.

8
20.03.2016, 03:11
2 ответа

Это зависит от вашей системы. Одна из многих операционных систем, особенно на базе Linux, sh является ссылкой на bash .

В этом случае все еще есть некоторые различия в поведении, когда bash пытается быть больше похожим на традиционную оболочку Борна при вызове sh , но все же принимает большинство башизмов.

В некоторых других операционных системах, таких как Debian, sh предоставляется dash , а не bash . Это имеет гораздо большее значение, поскольку тире не поддерживает bashisms, будучи спроектированным как чистая реализация оболочки POSIX.

В проприетарных операционных системах sh часто предоставляется POSIX-совместимым ksh88 , который, как и dash , не реализует bashisms. В Solaris 10 и старше, в зависимости от вашего PATH, sh , скорее всего, будет устаревшей оболочкой Bourne, предшествующей POSIX.

В любом случае, вы, вероятно, получили тот же результат с вашим тестом просто потому, что ваш скрипт не использовал какую-либо команду, параметр или синтаксис bash .

Когда вы запускаете ./ исполняемый файл , то, какая оболочка будет запущена, по существу зависит от shebang, записанного в начале исполняемого скрипта. Это будет bash , если shebang указывает это:

#!/bin/bash
....

Если shebang отсутствует и вы вызываете сценарий из POSIX-совместимой оболочки, сценарий технически должен выполняться первым sh ] найден в PATH.Многие интерпретаторы оболочки, такие как bash , dash и ksh , считают себя POSIX, поэтому будут интерпретировать сценарий. Обратите внимание, что переменная среды SHELL здесь не используется.

12
20.08.2021, 12:11

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

Вы можете использовать следующую строку в сценарии для проверки используемого интерпретатора:

ps h -p $$ -o args='' | cut -f1 -d' '

Вы можете явно указать оболочку, которая будет использоваться, когда сценарий будет выполняться непосредственно со строкой sheebang :

#!/bin/sh

или

#!/bin/bash
5
20.08.2021, 12:11

Теги

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