4

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

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

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

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

1 ответ1

1

Этот сайт сообщает нам, что существует $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 который содержит just . ./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
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .