カスタムzshrcを使用したzshの起動

カスタムzshrcを使用したzshの起動

次のコマンドに似たカスタム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が異なるドットファイルセットを見つけることができるように、環境変数を新しいディレクトリに設定できる必要があります。

マニュアルページに示すように、RCSGLOBAL_RCSrcファイルへのパスではありませんが(使用しようとすると)オプションを有効または無効にできます。たとえば、このフラグはzshにrcファイルから読み取るオプションを--rcs有効にします。RCSzshには、次のコマンドラインフラグを使用して有効または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

zshZDOTDIRを使用すると、選択したすべてのディレクトリで解釈をファイルとして呼び出すように指示できますが、選択したファイル.zshrc(必ずしも呼び出す必要はありません)を解釈するのは.zshrcかなり難しいことが証明されています。

shまたはksh、シミュレーションで;をzsh評価して一番上に追加し、次のことを実行できます。$ENVemulate 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:xzsh_directory_nameproj:x/opt/myproj/proj/xD${(D)somevar}zsh_directory_name

${(D):-}ここでは、空の場合は展開され、${:-}呼び出さ${no_var:-nothing}れたときに空になるように使用されます。以前は、次のように定義されていました。nothing$no_var${(D):-}zsh_directory_namezsh_directory_name

zsh_directory_name() {
  set +o promptsubst
  unset -f zsh_directory_name
  unset PS1; . /path/to/file
}

つまり、PS1が最初に拡張されたとき(最初のプロンプトで)オプションが設定解除(キャンセル)、定義解除${(D):-}(一度だけ実行しようとしているため)、設定解除とソースが提供されます。promptsubst-o promptsubstzsh_directory_name()$PS1/path/to/file

${PS1=%m%# }PS1が定義されていない場合(例:after)を展開(および割り当て$PS1)し、これがデフォルトになります。%m%#/path/to/fileunset%m%#PS1

関連情報