Я хочу иметь возможность запустить Zsh с пользовательским файлом RC похож на команду: bash --rc-file /path/to/file
Если это невозможно, то возможно ли запустить zsh, запустить source /path/to/file
и остаться в том же сеансе zsh?
Примечание: команда zsh --rcs /path/to/file
не работает, по крайней мере, не для меня ...
РЕДАКТИРОВАТЬ: В целом я хотел бы иметь возможность сделать следующее:
ssh
на удаленном сервере "example.com", запустить zsh
, source
моя конфигурация находится в /path/to/file
, все в 1 команду. Вот где я боролся, особенно потому, что я бы предпочел не записывать поверх файлов конфигурации на удаленной машине.
code as such
!Ответы:
Из справочных страниц:
поэтому вы должны иметь возможность установить переменную окружения
ZDOTDIR
в новый каталог, чтобы zsh искал другой набор файлов точек.Как страница людей предполагает,
RCS
аGLOBAL_RCS
не пути к радиоуправляемым файлам, как вы пытаетесь использовать их, а опцию вы можете включить или отключить. Так, например, флаг--rcs
активируетRCS
опцию, заставляя zsh читать из rc-файлов. Вы можете использовать следующие флаги командной строки для zsh, чтобы включить или отключитьRCS
илиGLOBAL_RCS
:Чтобы ответить на ваш другой вопрос:
Да, это довольно легко в соответствии с указанными выше инструкциями. Просто беги
zsh -d -f
и тогдаsource /path/to/zshrc
.источник
zsh -d -f; source /path/to/file
не выполняется вторая команда в первом сеансе zsh до выхода.ssh
на удаленный сервер "example.com", запуститеzsh
,source
моя конфигурация находится в/path/to/file
, все в 1 команду. Вот где я боролся, особенно потому, что я бы предпочел не записывать поверх файлов конфигурации на удаленной машине. Спасибо за ответ, хотя!ssh host "zsh -d -f; source /path/to/file"
, тогда ssh будет запускаться сначалаzsh
на удаленном хосте, а затемsource ...
после выхода из оболочки zsh. Вместо этого вам нужноssh -t host zsh -d -f
зайти в интерактивную оболочку на удаленном хосте или, если вам не нужна интерактивная оболочка, сделать этоssh host zsh -d -f -c \"source /path/to/file\; other command\; ... \"
.ssh -t host "zsh -d -f; source /path/to/file
меня бросает в интерактивную (и бесплодную)zsh
оболочку.ssh -t host "zsh -d -f; source /path/to/file"
, командаsource...
НЕ запускается внутри оболочки zsh. Он запускается в вашей оболочке входа в систему после выхода из оболочки zsh. Чтобы проверить это, запуститеssh host "zsh; echo foo"
. Вы увидите вывод «foo» после выхода из оболочки zsh.в то время как с ZDOTDIR, вы можете сказать,
zsh
интерпретировать файл с именем.zshrc
в любом каталоге по вашему выбору, а интерпретировать любой файл по вашему выбору (не обязательно вызываемый.zshrc
) оказывается довольно сложно.В
sh
илиksh
эмуляция,zsh
оценивает$ENV
; так что вы можете добавитьemulate zsh
в верхней части/path/to/file
и сделать:Еще один очень запутанный подход может быть:
Это заслуживает небольшого объяснения.
${foo::=value}
это расширение переменной, которое на самом деле устанавливает$foo
.$functions
это специальный ассоциативный массив, который отображает имена функций в их определения.С
promptsubst
опцией, переменные в$PS1
раскрываются. Таким образом, при первом запросе переменные в этом PS1 будут расширены.Эта
zsh_directory_name
функция представляет собой специальную функцию, которая помогает расширить~foo
до/path/to/something
и наоборот. Это используется, например,%~
в приглашении, чтобы, если текущий каталог был,/opt/myproj/proj/x
вы могли отобразить его~proj:x
, выполнивzsh_directory_name
сопоставлениеproj:x
<=>/opt/myproj/proj/x
. Это также используетсяD
флагом расширения параметра. Так что, если кто-то расширяется${(D)somevar}
, этаzsh_directory_name
функция будет вызвана.Здесь мы используем
${(D):-}
,${:-}
то есть,${no_var:-nothing}
расширяется доnothing
if$no_var
пусто, поэтому${(D):-}
расширяется до нуля во время вызоваzsh_directory_name
.zsh_directory_name
ранее был определен как:То есть, на первое расширение PS1 (на первой строке),
${(D):-}
приведет к тому ,promptsubst
возможность быть снята с охраны (отменить-o promptsubst
),zsh_directory_name()
чтобы быть неопределенным (как мы хотим , чтобы запустить его только один раз) ,$PS1
чтобы быть снята с охраны, а также/path/to/file
быть получены.${PS1=%m%# }
расширяется (и присваивается$PS1
) до тех%m%#
пор, пока PS1 уже не был определен (например,/path/to/file
после послеunset
), и%m%#
оказывается значением по умолчаниюPS1
.источник