一部のマシンatmで奇妙な動作が発生しています。少なくとも、それは私と私の同僚には奇妙に思え、私たちはそれについての説明を見つけることができませんでした:)
[編集1]
次の段落は間違っているようです。最後の編集2を参照してください。ここではbashとzshを使用しています。そのため、zshをデフォルトのシェルとして使用するように構成されている一部のzsh-default-machines(プレーンssh login@Host
)にSSHで(chsh -s /usr/bin/zsh
を使用して)実行すると、その後開かれたシェルはインタラクティブですがnon-loginシェル。それぞれのマシンにすでにログインしているかどうかは関係ありません。
私の理解では、マシンへのSSHは、そのマシンで新しいユーザーセッションを開始する必要があるため、シェルはログインシェルである必要がありますよね。それはzshの場合もそうではありませんか?
マシンでデフォルトのシェルをbashに変更する場合、マシンへのログインにはログインシェルが使用されます。
これはzshの正常な動作ですか?変更できますか?それともいくつかの設定ミスですか?
[/編集1]
[編集2] OK、ZSHのドキュメントによると、ログインシェルかどうかを簡単にテストできます。
$ if [[ -o login ]]; then; print yes; else; print no; fi
参照: http://zsh.sourceforge.net/Guide/zshguide02.html
ただし、zsh manエントリ/ドキュメントにより、zshは/etc/profile
をソースにする必要があり、/etc/profile.d/*.sh
の下のスクリプトをソースします。上記の私の質問は、スクリプトがではなくソースであるため、環境変数とシステム構成のほとんどが適切に初期化されないという事実に起因しました。ただし、前述のように、デフォルトのシェルとしてbashを使用している場合、/etc/profile
およびprofile.d-folder内のスクリプトが提供されます。
[/編集2]
[編集3-回答]以下のコメントの回答について、@StéphaneChazelasを送信してください。 zsh
/sh
互換モードで実行している場合、ksh
は/etc/profile
のみをソーシングしているようです(respecitve manエントリ https:// linux。 die.net/man/1/zsh )。 SSH経由でのログインはその互換モードをトリガーしないため、zsh
は必ずしも/etc/profile
を独自にソースするわけではありませんが、.zprofile
を介してトリガーする必要があります[/ edit 3]
システム:OS:Ubuntu 18.04 zsh-5.4.2、omzおよび一部のプラグインがアクティブ化。
ありがとうございました!
ZSHはこのように機能します。 /etc/profile
はZSHの初期化ファイルではありません。 ZSHは/etc/zprofile
および~/.zprofile
。
ZSHの初期化ファイル:
/etc/zshenv
~/.zshenv
/etc/zprofile
~/.zprofile
/etc/zshrc
~/.zshrc
/etc/zlogin
~/.zlogin
参考文献
sshd
は、クライアントが実行するコマンドを送信しない場合にログインシェルを実行します。これは、実行するコマンドが与えられていないときにrsh
サービスではなくrlogind
サービスを呼び出していたrshd
の動作を模倣するためです。
シェルにrlogind
またはlogin
またはtelnetd
のようなログインシェルであることを伝えるには、sshd
はシェルをargv[0]
で開始します-
で始まります。
もちろん、他のすべてのシェルのようにzsh
も同様に理解します。そうしないと、loginモードで呼び出すことができません。
ここで、ログインシェルを取得できなかったと思わせたのは、/etc/profile
が解釈されなかったためです。
/etc/profile
は、Bourneのようなシェル用のログインセッション初期化ファイルです。そこにある構文は、Bourne Shell構文(または、Bourne Shellが最近ほとんど使用されていないためPOSIX sh構文)であると予想され、構文がBourneまたは(ほとんど)下位互換性のあるすべてのシェルによってログイン時に読み取られます。 POSIX sh構文。
完全に異なる構文を持つcsh
とtcsh
は、代わりに/etc/csh.login
を使用します。 fish
は/etc/fish/config.fish
を使用します(ログインモードかどうかに関係なく)。
zsh
の構文もBourne/POSIXの構文と完全に互換性がないため、デフォルトでは/etc/profile
を読み取りません。ログインモードでの構成ファイルは/etc/zsh/zprofile
(またはzsh
がビルド時にどのように構成されたかに応じて/etc/zprofile
)であり、後者は/etc/zsh/zlogin
(または/etc/zlogin
)です。 zshrc
の後に提供されます。
zsh
ソースのみ/etc/profile
sh
またはksh
エミュレーションの場合、その構文はデフォルトのzsh
エミュレーションモード。
ログインモードでzsh
をソース/etc/profile
にしたい場合は、source /etc/profile
に/etc/zsh/zprofile
を追加する必要がありますが、それは、 /etc/profile
およびそれがソースとするその他のファイルの構文がzsh
の構文と互換性があることを確認しました。
または、以下を追加することもできます。
emulate sh -c 'source /etc/profile'
/etc/zsh/zprofile
宛て。次に、/etc/profile
はsh
エミュレーションモードで供給されます(そこで宣言された関数はsh
エミュレーションモードも保持します)。