Список файлов, которые оболочки обычно считывают при запуске -, ограничен лишь несколькими. Но те, в свою очередь, могут стать источником других, и это может привести к большим числам, например, при загрузке сложных систем заканчивания.
Подход состоит в том, чтобы запустить вашу оболочку с помощью:
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
.
Команда type zip
сообщает вам, что она не будет выполняться /usr/bin/zip
, поэтому вывод file /usr/bin/zip
не имеет значения. Он использует тот, что в /oraloc/app/product/11.2.0/client_1/bin/
, это подозрительно.
Если вы используете /usr/bin/zip
в своем скрипте вместо zip
, это исправит ситуацию.
Однако в долгосрочной перспективе проблема заключается в том, что ваша $PATH
переменная,имеет много специфичных для сайта вещей, которые имеют приоритет (он сначала пробует первый каталог, читая слева направо ). Некоторые из этих специфичных для сайта вещей не настроены -. Обратитесь к администратору вашего сайта.
В ksh93 есть известная ошибка, которая вызывает эту ошибку, когда с исполняемым файлом все в порядке. Solaris 10 использует такие архаичные двоичные файлы, что Korn Shell — это ksh88 (да, 1988 ), в котором нет этой ошибки. В Solaris 11 есть ksh93 и эта ошибка. RHEL, конечно, использует ksh93, поэтому есть ошибка, но у ISTR есть исправление для RHEL7, Solaris 11 не имеет исправления.