博客

共享 传承

导航

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.

posted on 2015-05-09 21:04  好好学习&&&天天向上  阅读(3566)  评论(0编辑  收藏  举报