我对*nix 系统中的dotfiles有一个基本的了解。但是我仍然对登录外壳和非登录外壳之间的区别感到很困惑?
一堆不同的答案(包括多个重复)已经解决了以下要点:
man bash
有关更多详细信息,请参阅文档(例如,)答案没有告诉(以及我仍然感到困惑的事情)是:
什么是用例一的登录或者非登录壳呢?(例如,我只配置zshrc
了zsh
和这足以让大多数个人开发的要求,我知道这不是这么简单什么vimrc
来vim
)
在非登录shell上使用登录的原因是什么(除了消耗不同的启动文件和生命周期)?
我在客户端和服务器上使用 Zsh。当我使用 ssh 在远程服务器上运行命令时,它找不到二进制文件:
ssh gt "cd /home/****/app/staging && bundle exec rake db:migrate RAILS_ENV=staging"
zsh:1: command not found: bundle
Run Code Online (Sandbox Code Playgroud)
如果我使用交互式 shell 进行 SSH,我可以很好地运行相同的命令。
在服务器上,$PATH
在 .zshrc 和 .zshenv 中设置
编辑
它似乎bundle
不在服务器上我的 $PATH 中。也许这与 RVM(Ruby 版本管理器)有关,它与 挂钩cd
,因此当您cd
进入包含文件的目录时.rvmrc
,它会设置 Ruby 环境并添加bundle
到 $PATH。我需要查明cd
非交互式 shell 是否也会触发该钩子。
根据文档
.zshenv
除非设置了 -f 选项,否则源自 shell 的所有调用。它应该包含设置命令搜索路径的命令,以及其他重要的环境变量。.zshenv
不应包含产生输出的命令或假设 shell 附加到 tty。
好的,很酷,所以我认为通过 ssh 登录被认为是对 zsh 的调用......但也许不是?
wayne@arglefraster ~
? echo $PATH 10:01:17
/usr/local/heroku/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
wayne@arglefraster ~
? zsh 10:01:20
e%
wayne@arglefraster ~
? echo $PATH 10:01:24
/usr/local/heroku/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/wayne/.rvm/bin:/home/wayne/.bin:/home/wayne/.local/bin
Run Code Online (Sandbox Code Playgroud)
那些额外的路径位被添加到我的.zshenv
文件中。
这是正常的,还是我有什么奇怪的事情发生?我应该将我的 PATH 修改移到别处吗?