Какой файл запуска используется моей оболочкой?

Какой файл запуска используется моей оболочкой?

В моей установке Ubuntu на Google Compute Engine есть несколько файлов запуска.

Есть ли команда, которая сообщает мне, какой файл запуска используется оболочкой, которую я в данный момент использую?

решение1

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

Один из подходов — запустить оболочку с помощью:

strace -e open your-shell

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

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

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

Некоторые оболочки, такие как , zshпо умолчанию выводят пути к файлу, из которого берется запускаемый код (хотя вы можете установить , PS4например +%x>, чтобы имя файла также выводилось для кода, запускаемого в функциях). Для некоторых других оболочек, таких как 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основанные на -подходах не будут перечислять файлы запуска, которые пусты или состоят только из комментариев или определений функций (если только эти функции не будут запущены позже), а также файлы запуска, которые оболочка обработала бы, если бы они там были.

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

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.

Связанный контент