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,例如rlogind
orlogin
或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
或ksh
emulation时的源,在这种情况下,它的语法比默认的zsh
仿真模式更接近 POSIX sh 的语法。
如果您想在登录模式下zsh
获取源代码/etc/profile
,则需要添加一个source /etc/profile
in /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
仿真模式)。
归档时间: |
|
查看次数: |
3439 次 |
最近记录: |