Вызовите zsh, затем * source * другой файл (при входе в интерактивный режим)

5

Этот вопрос, конечно, связан, но отличается от вопроса об исполнении команды .

Решения этих вопросов включают либо запуск подоболочки - что невозможно из-за необходимости выбора источника вместо выполнения, - либо изменение вашего ~/.zshrc, что невозможно, если вы хотите распространить скрипт, который это делает. (Или, скорее, изменение пользовательских конфигурационных файлов - это то, что вы просто не делаете)

Проблема в том, что в zsh нет такого --init-fileпараметра, как у bash (впервые, когда я увидел bash с функцией, которой не обладает zsh)

Я дам ответ на мой вопрос, но он ужасно уродлив, и я надеюсь, что кто-то знает хитрость, чтобы обойти его!

летающие овцы
источник
1
Если вы распространяете сценарий, вы не можете просто добавить команды в начало сценария (или, по крайней мере, sourceкоманду для получения соответствующего файла). Я думаю, что мне не хватает обоснования для вопроса.
chepner
Нет, сценарий должен быть получен изнутри оболочки, в которой установлены некоторые переменные среды, после того как пользовательские rc-файлы были получены. все это автоматически.
летающие овцы
Вы ищете что-то вроде modules( modules.sourceforge.net )?
mpy
Вау, это было бы полным перебором :) спасибо, хотя! Ну, на самом деле я бы хотел более простое решение, чем приведенное ниже, а не более сложное ...
летающие овцы
Чтобы обновить старый вопрос, я ищу то же самое. Мой пример использования - использование профиля iTerm для запуска определенной среды (просто установка $GOPATHи установка cdтам). Честно говоря, я очень удивлен, что этого не существует
nfirvine

Ответы:

2

Этот сайт говорит нам, что есть $ZDOTDIR, что делает возможным очень уродливое решение:

  1. /distdir/my-cmd:

    Используйте специфичные для оболочки способы замены файлов инициализации или безнадежно сбои.

    case $(basename $SHELL) in
        zsh)  OLD_ZDOTDIR="$ZDOTDIR" ZDOTDIR="/distdir" zsh -i ;;
        bash) bash --init-file "/distdir/.zshrc" -i ;;
        *)    echo "Unrecognized shell $SHELL"; exit 1 ;;
    esac
  2. /distdir/.zshrc:

    Именованные .zshrc, так как имена жестко закодированы в zsh, но bash может быть передан произвольно названному файлу через --init-file. Можно также назвать это, например our_stuff.sh, и создать, .zshrcкоторый содержит только . ./our_stuff.sh.

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

    # ignore profile, login & logout rc files, as we want no login shells
    case $(basename $SHELL) in
        zsh)
            test -f "$OLD_ZDOTDIR/.zshenv" && . "$OLD_ZDOTDIR/.zshenv"
            test -f "$OLD_ZDOTDIR/.zshrc"  && . "$OLD_ZDOTDIR/.zshrc"
            ;;
        bash)
            test -f ~/.bashrc        && source ~/.bashrc
            test -f /etc/bash.bashrc && source /etc/bash.bashrc
            ;;
    esac
    
    do_our_stuff!
    
    PS1="myenv! $PS1" #tell the user he’s in a modified shell
летающие овцы
источник
Отчасти я в замешательстве относительно вашей конечной цели: почему вы используете .zshrcфайл, когда запускаете экземпляр bash?
chepner
Чтобы ответить на последний вопрос, bashоболочка входа (интерактивная или нет) всегда выполняется, /etc/profileесли она существует. Я думаю, что это единственный глобальный файл запуска для bash(что-то подобное /etc/bashrcможет быть предоставлено дистрибутивом вашей ОС и получено из предоставленного по умолчанию .bashrcили /etc/profile, но bashсамо по себе его не ищет).
chepner
@chepner: я уже ответил на ваш комментарий в вопросе в начале пояснения к .zshrcфайлу. Я хочу, чтобы тот же файл был получен в bash, если пользователь использует bash, и в zsh, если он использует zsh. Bash принимает --init-file, zsh просто a $ZDOTDIR, в котором он ищет конкретные, жестко закодированные имена файлов. Поэтому я дал файлу одно из тех жестко запрограммированных имен, потому что bash не важно, как он называется. Понял? :)
летающая овца
Про последний вопрос: спасибо! Я обновлю ответ соответственно.
летающие овцы