Различие между sh-x и./для выполнения сценария

От lsof FAQ:

17.12.7 Почему делает lsof на моем Солярисе 7, 8 или 9 систем говорят, "не может считать namelist из/dev/ksyms?"

Вы, вероятно, пытаетесь использовать lsof исполняемый файл, созданный для более раннего выпуска Соляриса на Солярисе на 64 бита 7, 8 или 9 ядер. Вывод от lsof -v скажет Вам среду сборки Вашего lsof исполняемого файла. Необходимо было также получить предупреждающее сообщение, что lsof компилируется для другой версии Соляриса, чем та, под которой он работает - что-то вроде этого:

  lsof: WARNING: compiled for Solaris release X; this is Y

Необходимо создать lsof в системе, где Вы хотите использовать его. Для Соляриса на 64 бита 7, 8 и 9 Вам нужен компилятор, который может генерировать исполняемые файлы Соляриса на 64 бита - например, Семинар Sun 5 компиляторов C или позже, или недавняя gcc версия как 3,2.

6
04.05.2015, 18:56
3 ответа

Это зависит от содержимого скрипта оболочки и используемой оболочки. Сценарий оболочки может содержать код котеля , называемый Shebang, как следующее:

#!/usr/bin/env bash

Специальная последовательность »#! Указывает на систему системного вызова ядра EXEC () для использования программы, определенной сразу после него в качестве переводчика. Это означает, что вам придется посмотреть в файл, чтобы увидеть, какую программу будет использоваться для выполнения ее, если вы используете свой второй стиль выполнения.

Кроме того, из Руководства Bash (Bash -c »Set Commite Set")

-x  Print commands and their arguments as they are executed.

Что должна делать ваша команда - если вы используете Bash, см. Примечание ниже - распечатайте каждую строку в вашем скрипте и выполните его. Как ни странно, это должно привести к тому, что ваша первая команда будет медленнее, чем вторая, а не наоборот (снова: если интерпретатор, используемый в обоих случаях, одинаково). Гораздо чаще запустить оболочку без «x », если, конечно, вы хотите сделать отладку.

Нижняя строка: по описанным причинам здесь Используйте Shebang с программой ENV в (как рекомендуется здесь ) и использовать ваш второй стиль выполнения. Это самый независимый платформенный способ сделать вещи и является предпочтительным способом.

Примечание: другое, что усложняет вещи, заключается в том, что фактический переводчик, который находится позади / Bin / Sh, зависит от системы в системе. Во многих случаях это на самом деле Bash, и это то, что я предположил.

3
27.01.2020, 20:24

Файл ./foobar.sh запускается с помощью того, что следует за #! в первой строке. Если в этой строке прочитать #!/bin/sh -x, то она будет идентична случаю sh -x foobar.sh (предполагая, что sh разрешен в /bin/sh из PATH). Может быть, он запускается не sh, а bash?

Флаг -x печатает отладочную информацию, т.е. каждую команду перед ее выполнением.

7
27.01.2020, 20:24

Первая версия, с явным вызовом на SH будет запустить ваш скрипт с помощью SH (отображающих операторы трассировки, как запрашивается -x ). Второй, который не указывает явный интерпретатор, будет уважать строку Shebang, если таковые имеются, или по умолчанию для оболочки, которую вы используете в данный момент.

Например, если ваш сценарий имеет линию шебанга #! / bin / bash , или ваша оболочка - это bash, затем вторая форма ./ Сценарий приведет к тому, что выполнение для пробега запуска Поскольку Bash является более полнофункциональной оболочкой, чем SH, она может иметь разные характеристики производительности.

1
27.01.2020, 20:24

Теги

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