Я не уверен, что вы понимаете под "session open", но файл .xxxrc
для конкретной оболочки вызывается (согласно POSIX) всякий раз, когда запускается интерактивная оболочка.
Это верно как для оболочки входа, так и для вложенной оболочки в текущем сеансе.
В set -e
отсутствие failfailfail
приводит к завершению всего сценария (или подоболочка, если функция выполняется в подоболочке).
Если вам не нужно изменять состояние оболочки из функции, вы можете запустить ее в подоболочке.
myfunc() (
set -e
ls
failfailfail
uptime
)
Другой подход в bash - установить ловушку ERR
для выполнения return
. Если вы хотите сделать это локальным параметром, вам нужно восстановить старое значение ловушки, что немного обременительно.
myfunc() {
local old_ERR_trap=$(trap -p ERR)
if [[ -z $old_ERR_trap ]]; then old_ERR_trap="trap - ERR"; fi
trap 'local ret=$?; eval "$old_ERR_trap"; return $ret' ERR
ls
failfailfail
uptime
}
Иногда лучше поместить в Makefile, который занимается такими вещами.
#!/bin/bash
myfunc() { # watch out for tabs!
make -f - <<!
default:
ls -d
failfailfail
uptime
!
}
Единственный способ сделать это проще - это объединить все в одной команде, но это усложняет поддержку сценария, чем ваш последняя версия:
myfunc() {
ls && failfailfail && uptime || return $?
}
Учитывая, что все это простые команды, вы можете сделать это примерно так:
myfunc() {
ls &&
failfailfail &&
uptime ||
return $?
}