我想我了解交互式、登录和批处理 shell 之间的区别。请参阅以下链接以获取更多帮助:
我的问题是,如果我在交互式、登录或批处理 shell 上,如何使用命令/条件进行测试?
我正在寻找一个命令或条件(返回true或false),我也可以放在 if 语句中。例如:
if [[ condition ]]
echo "This is a login shell"
fi
Run Code Online (Sandbox Code Playgroud) 可能的重复:
登录 Shell 和非登录 Shell 之间的区别?
我一直在查看 /etc/profile。bash.bashrc 以查看它们是如何运行的,并注意一些是由非登录 shell 执行的,一些与交互式 shell 一起工作等。
这种类型的外壳有什么区别,即交互式和非交互式、登录和非登录等?
这个问题可能非常基本,但似乎我首先需要问什么是 shell。什么是 shell,它的相关性是什么,你如何使用它,以及它为什么存在?
更新:为了更好地理解问题的意图,除了定义之外,我还需要了解一种外壳或另一种外壳的用例。帮助理解的是用例,而不仅仅是字典定义。
我用我的学校的电脑,并想用zsh代替bash。我想将其设为默认 shell,但我无法运行命令,例如$ chsh -s $(which zsh)因为我没有管理员权限。
有没有办法可以将某些内容放入我的内容中.bashrc或zsh在打开时自动调用的内容作为解决方法?
澄清一下,zsh已经安装了。
在 Linux 中,据我所知,在所有 Unix 系统中,终端模拟器默认运行交互式、非登录 shell。这意味着,对于 bash,启动的 shell 将:
当启动非登录 shell 的交互式 shell 时,bash 会从
/etc/bash.bashrc和读取并执行命令~/.bashrc(如果这些文件存在)。这可以通过使用--norc选项来禁止 。该
--rcfile文件选项将强制bash读取和文件,而不是执行命令/etc/bash.bashrc和~/.bashrc。
对于登录 shell:
当 bash 作为交互式登录 shell 或作为具有
--login选项的非交互式 shell 调用时,它首先从文件中读取并执行命令/etc/profile(如果该文件存在)。读取该文件后,它会按该顺序查找~/.bash_profile、~/.bash_login、 和~/.profile,并从第一个存在且可读的命令中读取和执行命令。
--noprofile当 shell 启动时可以使用该选项来禁止这种行为。
在OSX上,但是,默认壳(这是bash)的开始在缺省终端(Terminal.app)实际上源~/.bash_profile或~.profile等等。换句话说,它的作用就像一个登录shell。
主要问题:为什么默认的交互式 shell 是 OSX 上的登录 shell?为什么 OSX 选择这样做?这意味着所有提及更改内容的基于 shell 的内容的说明/教程~/.bashrc在 OSX 上都将失败,反之亦然~/.profile。尽管如此,尽管可以对 Apple 提出许多指控,但雇用无能或愚蠢的开发人员并不是其中之一。据推测,他们有充分的理由这样做,那为什么呢?
子问题:Terminal.app 是否真的运行了一个交互式登录 shell …
我对*nix 系统中的dotfiles有一个基本的了解。但是我仍然对登录外壳和非登录外壳之间的区别感到很困惑?
一堆不同的答案(包括多个重复)已经解决了以下要点:
man bash有关更多详细信息,请参阅文档(例如,)答案没有告诉(以及我仍然感到困惑的事情)是:
什么是用例一的登录或者非登录壳呢?(例如,我只配置zshrc了zsh和这足以让大多数个人开发的要求,我知道这不是这么简单什么vimrc来vim)
在非登录shell上使用登录的原因是什么(除了消耗不同的启动文件和生命周期)?
在 Ubuntu 12.04 上,当我sudo -s的 $HOME 变量没有改变时,如果我的普通用户是regularuser,情况是这样的:
$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser
Run Code Online (Sandbox Code Playgroud)
我很久以前就放弃了 Ubuntu,所以我不能确定,但我认为这是默认行为。所以,我的问题是:
一季度。这是怎么做的?配置在哪里?
Q2。如何禁用它?
编辑: 感谢您的回答,这使事情澄清了一点,但我想我必须添加几个问题,以获得我正在寻找的答案。
Q3。在 Debian 中sudo -s,将 $HOME 变量更改为/root. 从我从答案中得到的信息和man sudoshell 运行的sudo -s是 中给出的那个/etc/passwd,对吗?
第 4 季度。但是,在 Ubuntu 和 Debian 上,/etc/passwd为 root提供的 shell都是/bin/bash. 在任一系统中,就 $HOME 而言,我找不到.profile或.bashrc文件的差异在哪里,因此行为sudo -s不同。这有什么帮助吗?
我正在使用 Linux Mint。我的登录 shell ( cat /etc/passwd | grep myUserName) 是 bash。
在我启动我的图形桌面环境并从中运行终端模拟器后,我可以看到它.bash_profile没有来源(其中exported 的环境变量未设置)。但是,如果我从一个文本控制台登录(ctrl+ alt+ F1)或手动运行bash -l从终端仿真器,.bash_profile工作正常。
当我认为.bash_profile应该在 X 启动时获取并且所有export'ed vars 应该在终端中可用,从 X 运行时,我错了吗?
PS 将所有内容放入.bashrc并从中采购.bash_profile并不是一个好主意(/sf/ask/63206251/):环境的东西应该只采购一次。
我经常登录到服务器,然后 cd 进入特定目录。是否可以将这两个命令简化为一个?
ssh bob@foo
cd /home/guest
Run Code Online (Sandbox Code Playgroud)
如果可能,我想避免更改 'foo' 上的任何内容,因为我必须与服务器管理员一起清除它。我使用 bash,但我愿意接受其他 shell 中的答案。
问题说明了一切。我目前使用 Arch Linux 和 zsh,但我想要一个(至少)既适用于 VT 又适用于 xterm 的解决方案,并且(希望最好)在我切换发行版或 shell 时仍能继续工作。
我在不同发行版的文档中听到了对这个问题截然不同的答案。Ubuntu 说“使用 .pam_environment”。我认为在 Arch 中,他们推荐的内容取决于您的外壳。目前,我将所有内容都放在.profile 中,如果由于某种原因 shell 没有提供它(例如,如果 .bash_profile 存在则为 bash),我会通过手动获取它来覆盖它。但似乎必须有更好的方法。
登录/非登录 shell 的概念与非交互式/交互式 shell 的概念(分别)相同吗?
或者概念正交产生四种不同的组合?
我想获得其清晰的画面.bashrc,.bash_profile脚本获得各种情况下采购的,我发现,文章有时可以互换使用这些概念。