Команда zip сценария оболочки KSH работает неправильно: eval: zip: невозможно выполнить [Ошибка формата Exec]

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

Подход состоит в том, чтобы запустить вашу оболочку с помощью:

strace -e open your-shell

(или эквивалентная команда в вашей системе, например truss/ tusc/ dtruss...)

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

Другим подходом может быть использование режима xtraceнекоторых оболочек, когда оболочка выводит на стандартный вывод то, что она собирается делать для каждой команды. Для этого вы просто вызываете оболочку с опцией -x.

Некоторые оболочки, такие как zsh, по умолчанию печатают пути к файлу, из которого выполняется код (, хотя вы можете установить PS4на +%x>, например, для имени файла также может быть напечатан для запуска кода в functions ). Для некоторых других, таких как bashили ksh93, вы можете распечатать их, изменив переменную $PS4.

PS4='+$BASH_SOURCE> ' bash -x
PS4='+${sh.file}> ' ksh93 -x
PS4='+%x> ' zsh -x

С помощью bashвы можете опубликовать -обработку вывода, чтобы сохранить только уникальные пути файлов с чем-то вроде:

PS4=' <:>$BASH_SOURCE<:>' BASH_XTRACEFD=3 3> >(
  awk -F'<:>' 'NF>2 && !seen[$2]++ {print $2}') bash -x

(при условии, что пути к файлам запуска не содержат символов новой строки или <:>и что в тех файлах запуска, которые содержат <:>)

, не выполняется многострочная команда -

Эти подходы, основанные на xtrace-, не будут отображать начальные -файлы up, которые пусты или состоят только из комментариев или определений функций (, если только эти функции не будут запущены позже ), а также не будут запускать -up файлы, которые оболочка обработала бы, если бы они были там.

Однако вы можете получить файлы, из которых были определены функции, с помощью

eval "(shopt -s extdebug; declare() { typeset -F \"\$2\"; }
  $(typeset -F))" | cut -d ' ' -f 3- | sort -u

с bashили

type ${(k)functions} | sed -n 's/.*is a shell function from //p' | sort -u

с zsh.

1
12.10.2018, 20:15
2 ответа

Команда type zipсообщает вам, что она не будет выполняться /usr/bin/zip, поэтому вывод file /usr/bin/zipне имеет значения. Он использует тот, что в /oraloc/app/product/11.2.0/client_1/bin/, это подозрительно.

Если вы используете /usr/bin/zipв своем скрипте вместо zip, это исправит ситуацию.

Однако в долгосрочной перспективе проблема заключается в том, что ваша $PATHпеременная,имеет много специфичных для сайта вещей, которые имеют приоритет (он сначала пробует первый каталог, читая слева направо ). Некоторые из этих специфичных для сайта вещей не настроены -. Обратитесь к администратору вашего сайта.

0
28.01.2020, 00:26

В ksh93 есть известная ошибка, которая вызывает эту ошибку, когда с исполняемым файлом все в порядке. Solaris 10 использует такие архаичные двоичные файлы, что Korn Shell — это ksh88 (да, 1988 ), в котором нет этой ошибки. В Solaris 11 есть ksh93 и эта ошибка. RHEL, конечно, использует ksh93, поэтому есть ошибка, но у ISTR есть исправление для RHEL7, Solaris 11 не имеет исправления.

0
06.02.2020, 15:56

Теги

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