http://blog.csdn.net/pipisorry/article/details/43235263
两者都是shell,都是解析工具。
bash(Bourne Again SHell) 是Linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。
sh(Bourne shell )是UNIX标准的默认shell,它简洁(concise)、紧凑(compact) 、高效(fast) ,是由AT&T编写,属于系统管理shell。
bash完全兼容Bourne shell,也就是说用Bourne shell的脚本不加修改可以在bash中执行。
[bash命令查询 Bash Reference Manual]
Tab键不能补全的问题
应该是在装某个软件的时候篡改了/etc/passwd文件,或者在创建用户的时候指定了shell为sh,导致tab键不能正常补全。
解决办法
root用户下修改/etc/passwd文件(该文件存储的是操作系统用户信息)
正确的应该是如pika:x:1007:1007::/home/pika:/bin/bash
可能是后面没有shell或者是/bin/sh导致的,修改或者加上去就可以了。
Note: 没有指定为/bin/bash时使用ssh登录只显示$且不会加载.bashrc文件,而指定了就应该显示pika@bdi4-server:~$ 。
变量的取用与设置:echo, 变量设置规则, unset
覆盖型写法 (文件里原来的内容被覆盖)
echo "aaa" > a.txt
echo aaa > a.txt
添加型写法 (新内容添加在原来内容的后面)
echo "aaa" >> a.txt
Note: 如果echo "aaa" >> a.txt 1> /dev/null是不会追加到a.txt的,而echo "aaa" || tee -a a.txt 1> /dev/null可以
(echo "section: screens
$(hostname):
$client:
end
section: links
$client:
right = $(hostname)
$(hostname):
left = $client
end
")
注意括号不能去掉,如果括号去掉的话,那么只能写入最后一个! "也不能去掉!
sudo echo a > 1.txt
-bash: 1.txt: Permission denied
bash 拒绝这么做,说是权限不够.这是因为重定向符号 “>” 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。
解决:
echo a |sudo tee -a 1.txt // -a是追加的意思,等同于 >>
将 sudo 的影响范围扩展到整条命令:sudo sh -c "echo a > 1.txt"
[sudo对echo等命令提升权限]
echo要变换颜色的时候,要使用参数-e
格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"
背景色:0 透明(使用终端颜色), 40 黑, 41 红, 42 绿, 43 黄, 44 蓝 45 紫, 46 青绿,47白(灰)
前景色: 30 黑 31 红, 32绿, 33 黄, 34 蓝, 35 紫, 36 青绿, 37 白(灰)
高亮度:高亮是1,不高亮是0。注意m后面紧跟字符串。
如: echo -e "\033[31;1m wget export client=pika \033[0m"
[echo输出带颜色的字体 ]
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
执行的脚本文件名为 $0 这个变量,这些较为特殊的变量可以在 script 内使用来调用这些参数喔!
那个 $@ 与 $* 基本上还是有所不同啦!不过,一般使用情况下可以直接记忆 $@ 即可。
所谓的环境变量与自订变量,那么这两者之间有啥差异呢?其实这两者的差异在于“ 该变量是否会被子程序所继续引用”啦!唔!那么啥是父程序?子程序? 这就得要了解一下指令的下达行为了。
当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,这个程序的识别使用的是一个称为程序识别码,被称为 PID 的就是。 接下来你在这个 bash 下面所下达的任何指令都是由这个 bash 所衍生出来的,那些被下达的指令就被称为子程序了。 我们可以用下面的图示来简单的说明一下父程序与子程序的概念:
图10.2.3、程序相关性示意图
因为子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自订变量啦!所以你在原本 bash 的自订变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现!
如果我能将自订变量变成环境变量的话,那不就可以让该变量值继续存在于子程序了? 呵呵!没错!此时,那个 export 指令就很有用。
使用示例
export ECLIPSE_URL='https://www.eclipse.org/downloads/download.php?file=/oomph/epp/neon/R1/eclipse-inst-linux64.tar.gz&mirror_id=1109'
export a=string
Linux下环境变量path的配置,Linux系统中把***目录添加到PATH中。
1.# PATH=$PATH:/etc/apache/bin
使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后(关闭terminal就会失效),PATH 设置就会失效
2.$sudo vi /etc/profile
在适当位置添加 PATH=$PATH:/etc/apache/bin
这种方法最好,除非你手动强制修改PATH的值,否则将不会被改变
export JAVA_HOME=/opt/jdk1.8.0_73
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/
export HADOOP_HOME=/usr/local/hadoop-2.6.4
export SPARK_HOME=/opt/spark
export PYSPARK_PYTHON=python3
export PATH=$PATH:$JAVA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
在/etc/profile中修改path,重启后path就成功设置了。如果用ssh localhost登录,不用重启自动设置了。直接新开terminal不重启则要source一下才生效。
Note:
1 包含需要用的其它变量时,PATH最好放最后,比如lz发现,ssh localhost登录时,如果乱序,PATH中有些值就是空的!
2 $后面的变量应该可加{}也可不加{}。
3 赋值时,应该可加""也可不加""。
4 配置export的内容必须是实际目录,不能是ln -s软链接的目录。
5 = 即等号两边不能有任何空格
6 在修改了PATH值或任何环境变量后,都要用export将其输出,新的PATH值才能生效。
3.# vi ~/.bash_profile
修改PATH行,把/etc/apache/bin添加进去
这种方法是针对当前用户起作用的,ssh localhost并没有生效!
当然也可以修改/etc/environment代替/etc/profile的修改
pika:~$sudo vi /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
PATH="$PATH:${JAVA_HOME}/bin:${SPARK_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin"
export PATH
export JAVA_HOME=/opt/jdk1.8.0_73
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/
皮皮blog
bash 的进站与欢迎讯息
虾密! bash 也有进站画面与欢迎讯息喔?真假?真的啊! 还记得在终端机接口 (tty1 ~ tty6) 登陆的时候,会有几行提示的字串吗?那就是进站画面啊! 那个字串写在哪里啊?呵呵!在 /etc/issue 里面啊!先来看看:
[dmtsai@study ~]$ cat /etc/issue
\S
Kernel \r on an \m
man issue 配合 man agetty 得到下面的结果:
issue 内的各代码意义
\d 本地端时间的日期;
\l 显示第几个终端机接口;
\m 显示硬件的等级 (i386/i486/i586/i686...);
\n 显示主机的网络名称;
\O 显示 domain name;
\r 操作系统的版本 (相当于 uname -r)
\t 显示本地端时间的时间;
\S 操作系统的名称;
\v 操作系统的版本。
除了 /etc/issue 之外还有个 /etc/issue.net 呢!这是啥?这个是提供给 telnet 这个远端登陆程序用的。 当我们使用 telnet 连接到主机时,主机的登陆画面就会显示 /etc/issue.net 而不是 /etc/issue 呢!
至于如果您想要让使用者登陆后取得一些讯息,例如您想要让大家都知道的讯息, 那么可以将讯息加入 /etc/motd 里面去
皮皮blog
环境配置文件: login, non-login shell, /etc/profile, ~/.bash_profile, source, ~/.bashrc, /etc/bash.bashrc
login 登录环境:指用户登录系统后的工作环境
non-login 非登录环境:指用户调用子shell时所使用的用户环境
“login shell” 代表用户登入, 比如使用 “su -“ 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式。该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般再 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件。
no-login shell 是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell。该模式下是不会自动去运行任何的 profile 文件。
interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令.
该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc 和 ~/.bashrc 文件
non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash.
该模式下不会执行任何的 rc 文件
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.此文件默认调用/etc/bash.bashrc文件。只有 Login 时,/etc/profile 文件才会被调用。
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bashshell被打开时,该文件被读取.
~/.profile ~/.bash_profile ~/.bash_login:用户登录执行,source立即生效。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
~/.bashrc(~/.bash_profile for OS X):每次打开新窗口时执行。该文件包含专用于你的bashshell的bash信息。与/etc/bashrc冲突则执行前者~。针对于用户的配置,应该将配置信息写入~/.bashrc文件。
~/.bash_logout:当每次退出系统(退出bashshell)时,执行该文件。
Note: 编程中,如果你只是在terminal中运行代码,设置路径如SPARK_HOME时,可以只设置在~/.bashrc中;但是如果要在其它IDE如pycharm中执行,就要将SPARK_HOME设置在~/.profile中!!!
其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.
bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.
/etc/enviroment
/etc/profile 是所有用户的环境变量; /etc/enviroment是系统的环境变量
登陆系统时shell读取的顺序应该是
/etc/profile ->/etc/enviroment -->$HOME/.profile -->$HOME/.env
如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。
Note:
奇怪的是,lz在/etc/enviroment中设置PATH后,每次重新打开terminal或者重启后必须执行. /etc/enviroment设置才会生效,无论是直接在linux系统中还是在docker中,所以如果想要设置所有用户的PATH变量,还是修改/etc/profile吧。
修改/etc/profile source以后重新打开一个terminal并不会生效,要source一下;但是重启后打开terminal就会一直生效。
修改~/.bashrc source以后重新打开一个terminal会生效,但是它切换用户后设置就无效了。
环境设置文件有两种:系统环境设置文件 和 个人环境设置文件
1.系统中的用户工作环境设置文件:
登录环境设置文件:/etc/profile
非登录环境设置文件:/etc/bashrc
2.用户个人设置的环境设置文件:
登录环境设置文件: $HOME/.bash_profile //这个是环境变量设置的地方
非登录环境设置文件:$HOME/.bashrc //这个是定义别名的地方
Note:
1 ~/.bash_profile 都是在取得 login shell 的时候才会读取的配置文件,所以, 如果你将自己的偏好设定写入上述的档案后,通常都是得注销再登入后,该设定才会生效。
2 直接读取配置文件而不注销登入:source 命令
[root@www ~]# source ~/.bashrc
[root@www ~]# . ~/.bashrc
利用 source 或小数点 (.) 都可以将配置文件的内容读取到目前的shell 环境中! 如我修改了 ~/.bashrc ,那么不需要注销,立即以 source ~/.bashrc 就可以将刚刚最新讴定的内容读取到目前环境中。
这个方法的原理就是再执行一次/etc/profile shell脚本,注意如果用sh /etc/profile是不行的,因为sh是在子shell进程中执行的,即使PATH改变了也不会反应到当前环境中,但是source是在当前 shell进程中执行的,所以我们能看到PATH的改变。
皮皮blog
from:http://blog.csdn.net/pipisorry/article/details/43235263
ref: SSH远程连接时环境变量问题