nig*_*arc 6 shell login zsh profile dot-files
我在我们的一些机器 atm 上遇到了奇怪的行为。至少,这对我和我的同事来说似乎很奇怪,我们没有找到任何解释:)
[编辑 1]
下一段似乎是错误的。请参阅最后的编辑 2。
我们在这里使用 bash 和 zsh。因此,当通过 SSH 连接到某些ssh login@host配置为使用 zsh 作为默认 shell(带有chsh -s /usr/bin/zsh)的 zsh-default-machines(plain )时,然后打开的 shell 是一个交互式但非登录的shell,无论我们是否已经登录是否在相应的机器上。
根据我的理解,通过 SSH 连接到一台机器应该是在该机器上启动一个新的用户会话,因此要求 shell 是一个登录 shell,对吗?zsh 不应该也是这种情况吗?
在机器上将默认 shell 更改为 bash 时,登录机器使用 login-shell。
这是 zsh 的正常行为吗?能不能改?或者是一些配置错误?
[/编辑 1]
[编辑 2] 好的,根据 ZSH 文档,您可以轻松测试它是否是登录 shell:
$ if [[ -o login ]]; then; print yes; else; print no; fi
Run Code Online (Sandbox Code Playgroud)
见:http: //zsh.sourceforge.net/Guide/zshguide02.html
但是,由于 zsh man 条目/文档, zsh 应该 source /etc/profile,而后者又在/etc/profile.d/*.sh. 我上面的问题源于这样一个事实,即脚本没有来源,因此我们的大多数环境变量和系统配置内容都没有正确初始化。但是,如上所述 - 当我们使用 bash 作为默认 shell/etc/profile并且 profile.d 文件夹中的脚本是来源时。
[/编辑 2]
[编辑 3 - 答案] 感谢 @StéphaneChazelas 在下面的评论中给出答案!它似乎zsh仅/etc/profile在sh/ksh兼容模式下运行时才进行采购(请参阅相应的 man 条目https://linux.die.net/man/1/zsh)。由于通过 SSH 登录不会触发该兼容模式,zsh因此不一定/etc/profile是它自己的来源,但必须通过.zprofile
[/edit 3]触发
系统:操作系统:Ubuntu 18.04 zsh-5.4.2,已激活 omz 和一些插件。
谢谢!
Sim*_*mba 19
ZSH 就是这样工作的。/etc/profile不是 ZSH 的初始化文件。ZSH 使用/etc/zprofile和~/.zprofile。
ZSH 的初始化文件:
/etc/zshenv~/.zshenv/etc/zprofile~/.zprofile/etc/zshrc~/.zshrc/etc/zlogin~/.zlogin尖端:
参考
sshd当客户端不发送任何命令运行时运行登录 shell。这是为了模仿在没有给出任何命令运行时rsh调用rlogind服务而不是调用服务的行为rshd。
要告诉 shell 它是一个登录 shell,例如rlogindorlogin或telnetd,sshd请argv[0]使用以-.
或者当然,zsh就像其他每个 shell 都理解它一样。如果没有,则永远无法在登录模式下调用它。
在这里,让您认为您没有获得登录 shell 的症状是因为/etc/profile没有被解释。
/etc/profile是类似 Bourne 的 shell 的登录会话初始化文件。那里的语法预计采用 Bourne shell 语法(或者可能是 POSIX sh 语法,因为 Bourne shell 现在几乎从未使用过)并且在登录时被所有语法(大部分)向后兼容 Bourne 或POSIX sh 语法。
csh并且tcsh使用完全不同的语法/etc/csh.login。fish使用/etc/fish/config.fish(无论是否处于登录模式)。
zsh的语法也与 Bourne/POSIX 的语法不完全兼容,因此默认情况下,它不读取/etc/profile. 它在登录模式下的配置文件是/etc/zsh/zprofile(或/etc/zprofile取决于zsh构建时的配置方式)和/etc/zsh/zlogin(或/etc/zlogin)后者在zshrc.
zsh只有/etc/profile在 insh或kshemulation时的源,在这种情况下,它的语法比默认的zsh仿真模式更接近 POSIX sh 的语法。
如果您想在登录模式下zsh获取源代码/etc/profile,则需要添加一个source /etc/profilein /etc/zsh/zprofile,但您只希望在确保/etc/profile其源代码的语法以及它所提供的任何其他文件与zsh.
或者,您可以添加:
emulate sh -c 'source /etc/profile'
Run Code Online (Sandbox Code Playgroud)
到/etc/zsh/zprofile. 然后/etc/profile将在sh仿真模式下获取(并且在那里声明的函数也将保留sh仿真模式)。