zoukankan      html  css  js  c++  java
  • linux使用c shell 、b shell 环境变量的问题 ------ 转载

    最近玩Linux虚拟机,遇到一个棘手的问题,跟下面帖子的问题如出一辙,遂转载这篇帖子,学而用之。

    http://www.bubuko.com/infodetail-795095.html

     

    背景:

     

    昨天快下班时,每次赶燕郊班车的曹同学都会准时跑掉,可是都已经快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

     

     
  • 相关阅读:
    hive笔记
    hive数据倾斜的解决办法
    Kafka笔记7
    kafka笔记6
    Kafka笔记5
    kafka笔记4(2)
    kafka笔记4
    Kafka笔记3
    kafka笔记2
    kafka笔记1
  • 原文地址:https://www.cnblogs.com/hxing/p/14497261.html
Copyright © 2011-2022 走看看