次のコマンドに似たカスタムrcファイルを使用してzshを起動できるようにしたいと思います。bash --rc-file /path/to/file
source /path/to/file
これが不可能な場合は、zshを起動して実行してから同じzshセッションを維持できますか?
注:このコマンドはzsh --rcs /path/to/file
少なくとも私には機能しません...
編集:全体的に次のことができるようにしたいです。
ssh
リモートサーバー「example.com」に移動し、設定があるzsh
すべての実行を1つのコマンドで実行します。特に、リモートシステムの設定ファイルを上書きしたくないので、これが私が困難になった部分です。source
/path/to/file
答え1
マニュアルページから:
STARTUP/SHUTDOWN FILES
Commands are first read from /etc/zshenv; this cannot be overridden. Subsequent be‐
haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup
files, while the second only affects global startup files (those shown here with an
path starting with a /). If one of the options is unset at any point, any subsequent
startup file(s) of the corresponding type will not be read. It is also possible for
a file in $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are set by
default.
Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login shell, com‐
mands are read from /etc/zprofile and then $ZDOTDIR/.zprofile. Then, if the shell is
interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc. Finally, if
the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.
When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.
This happens with either an explicit exit via the exit or logout commands, or an
implicit exit by reading end-of-file from the terminal. However, if the shell termi‐
nates due to exec'ing another process, the logout files are not read. These are also
affected by the RCS and GLOBAL_RCS options. Note also that the RCS option affects
the saving of history files, i.e. if RCS is unset when the shell exits, no history
file will be saved.
If ZDOTDIR is unset, HOME is used instead. Files listed above as being in /etc may
be in another directory, depending on the installation.
As /etc/zshenv is run for all instances of zsh, it is important that it be kept as
small as possible. In particular, it is a good idea to put code that does not need
to be run for every single shell behind a test of the form `if [[ -o rcs ]]; then
...' so that it will not be executed when zsh is invoked with the `-f' option.
ZDOTDIR
したがって、zshが異なるドットファイルセットを見つけることができるように、環境変数を新しいディレクトリに設定できる必要があります。
マニュアルページに示すように、RCS
はGLOBAL_RCS
rcファイルへのパスではありませんが(使用しようとすると)オプションを有効または無効にできます。たとえば、このフラグはzshにrcファイルから読み取るオプションを--rcs
有効にします。RCS
zshには、次のコマンドラインフラグを使用して有効またはRCS
無効にできますGLOBAL_RCS
。
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
他の質問に答えるには:
zshを起動して「source /path/to/file」を実行してから、同じzshセッションを維持できますか?
はい、上記の指示に従って、非常に簡単です。ただ実行してzsh -d -f
くださいsource /path/to/zshrc
。
答え2
zsh
ZDOTDIRを使用すると、選択したすべてのディレクトリで解釈をファイルとして呼び出すように指示できますが、選択したファイル.zshrc
(必ずしも呼び出す必要はありません)を解釈するのは.zshrc
かなり難しいことが証明されています。
sh
またはksh
、シミュレーションで;をzsh
評価して一番上に追加し、次のことを実行できます。$ENV
emulate zsh
/path/to/file
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
別の非常に複雑なアプローチは次のとおりです。
ssh -t host 'PS1='\''${${functions[zsh_directory_name]::="
set +o promptsubst
unset -f zsh_directory_name
unset PS1
. /path/to/file
"}+}${(D):-}${PS1=%m%# }'\' exec zsh -o promptsubst -f
この質問には少し説明が必要です。
${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
$no_var
${(D):-}
zsh_directory_name
zsh_directory_name
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
つまり、PS1が最初に拡張されたとき(最初のプロンプトで)オプションが設定解除(キャンセル)、定義解除${(D):-}
(一度だけ実行しようとしているため)、設定解除とソースが提供されます。promptsubst
-o promptsubst
zsh_directory_name()
$PS1
/path/to/file
${PS1=%m%# }
PS1が定義されていない場合(例:after)を展開(および割り当て$PS1
)し、これがデフォルトになります。%m%#
/path/to/file
unset
%m%#
PS1