カスタムzshrcでzshを起動します


17

コマンドに似たカスタムrcファイルでzshを起動できるようにしたい: bash --rc-file /path/to/file

これが不可能な場合、zshを起動し、実行source /path/to/fileして、同じzshセッションにとどまることは可能ですか?

注:コマンドzsh --rcs /path/to/fileは、少なくとも私にとっては機能しません...

編集:全体として、私は次のことができるようにしたい: sshリモートサーバー「example.com」に、実行zshsource私の設定は/path/to/file、すべて1コマンドで。これは、特にリモートマシン上の設定ファイルを上書きしたくないため、苦労した場所です。


1
こんにちはKatz、unix.SEへようこそ。あなたの質問を編集して、読みやすく(少し)簡単にする書式を追加しました。[編集]をクリックして、動作を確認できます。また、「ありがとう」や署名(Stack Exchangeネットワーク上のすべての投稿が自動的に署名されます)などの余分なものも削除しました。
DRS

1
ありがとう、今、私はタイプする方法を学びましたcode as such
hjkatz

回答:


17

manページから:

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が異なるドットファイルのセットを検索できるようにする必要があります。

マニュアルページに示されているように、rcファイルへのパスRCSGLOBAL_RCSはなく、使用しようとしていますが、有効または無効にすることができるオプションです。そのため、たとえば、フラグ--rcsRCSオプションを有効にし、zshがrcファイルから読み取るようにします。次のコマンドラインフラグを使用して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


これは私の質問ごとに機能するので、1つのコマンドしか実行できないことに言及できませんでした。これは、私がこれを使用したいものを満たしていません(私の個人的な構成のカスタムssh)。問題は、zsh -d -f; source /path/to/file実行することにより、zshの最初のセッションで2番目のコマンドが終了するまで実行されないことです。
hjkatz

全体として、次のことができるようになりたいと思います。 sshリモートサーバー "example.com"に、実行zshsource私の構成にある/path/to/file、すべて1コマンドで。これは、特にリモートマシン上の設定ファイルを上書きしたくないため、苦労した場所です。答えてくれてありがとう!
hjkatz

あなたの問題はカスタムzshrcの使用ではなく、ssh上のシェルの使用方法を知らないことにあるようです。を実行するssh host "zsh -d -f; source /path/to/file"と、sshは最初zshにリモートホストで実行され、次にsource ...zshシェルが終了します。代わりにあなたがやりたいことはssh -t host zsh -d -fに、リモートホストの対話型シェルにドロップするか、対話型シェルが必要ない場合は、doを実行しますssh host zsh -d -f -c \"source /path/to/file\; other command\; ... \"
jayhendren

いいえ、sshが対話型シェルでどのように機能するかを理解しています。問題は、実行ssh -t host "zsh -d -f; source /path/to/fileするとインタラクティブな(そして不毛の)zshシェルに落ちてしまうことです。
hjkatz

1
これがなぜなのか、どうすれば修正できるのかについてはすでに説明しました。を実行するssh -t host "zsh -d -f; source /path/to/file"と、コマンドsource...はzshシェル内で実行されません。zshシェルが終了した後、ログインシェルで実行されます。これをテストするには、を実行しssh host "zsh; echo foo"ます。後に出力「foo」が表示されますzshシェルを終了ます。
jayhendren

4

ZDOTDIRを使用すると、選択した任意のディレクトリでzsh呼び出されるファイルを解釈するように指示.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関数は、~footo /path/to/somethingとreverseの展開に役立つ特別な関数です。これは、たとえば%~現在のディレクトリが/opt/myproj/proj/xマッピング<=> ~proj:xzsh_directory_name実行することで表示できるようにします。これは、パラメーター展開フラグでも使用されます。したがって、を展開すると、その関数が呼び出されます。proj: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 promptsubst)し、zsh_directory_name()未定義(一度だけ実行したい)$PS1として設定を解除し、/path/to/fileソースを取得します。

${PS1=%m%# }PS1が既に定義されていない場合(たとえば、後に)に展開(および割り当て$PS1)し、%m%#/path/to/fileunset%m%#たまたまのデフォルト値になりPS1ます。


これはかなり贅沢に見えますが、できるだけ早く試してみます。これがうまくいくことを期待しています!
hjkatz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.