В моей установке 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
.