linux使用c shell 、b shell 环境变量的问题
(睡醒午觉后,头脑特别清晰,于是整理一篇把曹同学的昨天问题解答了^_^,收集资料的过程,也是学习的过程)
背景:
昨天快下班时,每次赶燕郊班车的曹同学都会准时跑掉,可是都已经快7点了,曹同学还在座位无动于衷,这很反常,过了一小会,曹同学跑过来。
曹同学:我犯错误了~~~把一台linux机器搞挂了~~~
me:10.10.0.5?告警中层?
曹同学:是的
me:挂了是什么情况?
曹同学:把mqadmin用户改成c shell后,所有命令都失效了...
me:(觉得很神奇,但只要不是丢文件,只是登录不进去,也没什么紧张的,多数都是环境变量问题吧)
登录演示一番,mqadmin由 b shell 改为 c shell 后,环境变量使用.cshrc了
进去的现象就是:除了cd 命令,其他命令 全部提示 command not found.
所以无法到 mqadmin用户的根目录去删除 .cshrc
(曹同学想去 删除.cshrc 那么其他命令就会生效了)想法是对的,但是怎么进去呢;而且删了.cshrc就能ok。那就说明环境变量的事情啊。
为了能够登录进去,先使用root用户登录,修改/etc/passwd文件,把 csh 用户 改成 bash。ok啦,b shell 用户就可以 删除.cshrc了。木有问题了。
但是问题是:曹同学还是想使用c shell 自称熟悉 c shell。(我使用b shell 可不是因为熟悉b shell,是因为是默认。不过给我b shell 我就用bash_profile,给c shell 就用cshrc,我可没有曹同学那么挑剔^_^)
我知道用户从b shell 修改为 c shell 命令不生效,肯定是环境变量的问题,但是怎么解释这个事情呢。那就要搜集几篇文章了。
1 为什么linux 下b shell 用户都木有问题?
第一個流行的 shell 是由 Steven Bourne 發展出來的,為了紀念他所以就稱為 Bourne shell ,或直接簡稱為 sh !而後來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附於 BSD 版的 Unix 系統中的 shell ,這個 shell 的語法有點類似 C 語言,所以才得名為 C shell ,簡稱為 csh !由於在學術界 Sun 主機勢力相當的龐大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一 。
因为Linux 预设的是 Bash Shell 哦,默认的 Shell
linux的Bash shell,Unix的c shell 还有各种扩充出来的ksh tcsh...(语法不通,道理相同...)
root用户默认是bash呢...
2 command not found 几乎都是环境变量的事
换了c shell后,为什么ls 命令门都不生效了呢,为啥only cd一个命令还有效呢?
ls命令们在哪里?
/bin: bin为binary的简写主要放置一些系统的必备执行档例如: cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。
/sbin: 主要放置一些系统管理的必备程式例如: cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。
/usr/bin: 主要放置一些应用软体工具的必备执行档例如: c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等。
/usr/sbin: 放置一些网路管理的必备程式例如: dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等
既然大部分命令们都在 /bin /sbin/ /usr/bin /usr/sbin里面,那么就在path里面将它们都加进去了,以防 你再改成cshrc它不让命令们生效啊 ^_^
$PATH $HOME/bin /sbin /usr/bin /usr/sbin
ok啦,这样用户从b shell 改成 c shell ,只需要用root用户在/etc/passwd里面将bash 改成csh 就可以了。只要在.cshrc里面加上path,而且 要 source .cshrc 生效哦~~~
3 为什么cd命令没有收到影响捏???
网上的解释:Bash 有一些自己内部的命令,cd 就是其中一个。
因为在我们的系统中 cd 命令其实并没有对应某个 binary,但是我们却又仍然可以执行这个命令,这就是因为 cd 其实是 BASH 的一个内部命令。内部命令都是被整合进入 shell 里面的
补充知识:b shell 下的bashrc bash_profile profile
(. ./.bash_profile使环境变量生效,至于是.bashrc还是.bash_profile只是login的区别了。)
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
~/.bash_profile 是交互式、login 方式进入bash 运行的; ~/.bashrc 是交互式 non-login 方式进入bash 运行的; 通常二者设置大致相同,所以通常前者会调用后者。
当新创建一个b shell 用户的时候,系统默认生成三个文件.bashrc .bash_profile .bash_logout
按照上述阐述各文件之间的关系,简言之.bashrc与.bash_profile是两种不同的登入方式
.bashrc
if一段呼叫/etc/basrc(linux Red Hat 特有的)
.bash_profile
if 一段判断家目录是否有bashrc存在,读取家目录的bashrc中设定。
login 与 non-login
- login shell:取得 bash 時需要完整的登入流程的,就稱為 login shell。舉例來說,你要由 tty1 ~ tty6 登入,需要輸入使用者的帳號與密碼,此時取得的 bash 就稱為『 login shell 』囉;
- non-login shell:取得 bash 介面的方法不需要重複登入的舉動,舉例來說,(1)你以 X window 登入 Linux 後, 再以 X 的圖形化介面啟動終端機,此時那個終端介面並沒有需要再次的輸入帳號與密碼,那個 bash 的環境就稱為 non-login shell了。(2)你在原本的 bash 環境下再次下達 bash 這個指令,同樣的也沒有輸入帳號密碼, 那第二個 bash (子程序) 也是 non-login shell 。
.bashrc 或者.bash_profile 如何生效呢
使用 . 或者 source
. ./.bash_profile
source ~/.bash_profile
--by Joyce
happy weekend.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。