Linux备注

Linux备注

Linux一些知识和技巧的备忘

2018-04-12

Linxu 环境变量文件

好久不见,最近出了一些事情导致没有心情更新博客。最近做毕业设计,刚好可以用Centos再回顾一下Linux的知识。

首先,关于.bashrc和.bash_profile。区分两者之间的区别,首先要搞清楚login shell和no-login shell之间的区别。

login shell: 当你通过终端输入用户名和密码,然后进入到terminal,这时候进入的shell环境就叫做是login shell,例如,通过ssh远程进入到主机。

no-login shell: 顾名思义就是不需要输入用户名密码而进入的shell环境,例如你已经登陆了你的桌面电脑,这时候在应用管理器中找到termianl图标,然后双击打开终端,也就是通过像gnome,KDE这种桌面环境而进入的终端,这时候你进入的shell环境就是所谓的no-login shell环境。简而言之,就是把你想通过login shell运行的shell命令放入到.bash_profile中,把想通过no-login shell运行的shell命令放入到.bashrc文件中。

Linux系统默认使用的shell为bash,在shell启动的时候会读取根据情况读取.bash_profile和.bashrc文件。准确的说,当shell是交互式登录shell时,读取.bash_profile文件,如在系统启动、远程登录或使用su -切换用户时;当shell是交互式登录和非登录shell时都会读取.bashrc文件,如:在图形界面中打开新终端或使用su切换用户时,均属于非登录shell的情况。简单的说,.bash_profile只在会话开始时被读取一次,而.bashrc则每次打开新的终端时,都会被读取。所以一些常用的alias还是应当放在.bashrc中。

Shell 声明

“#!/bin/sh”是对shell的声明,说明你所用的是那种类型的shell及其路径所在。

如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell。

比如:如果脚本被编写为在Korn Linux中运行,而默认运行shell脚本的为C shell csh,则上述脚本在执行过程中很可能失败。

#!/bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。

其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。

比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等。
所以建议大家就把”#!/bin/sh”当成C 语言的main函数一样,写shell必须有,以使shell程序更严密。

./ source sh 区别

source命令用法:

source FileName

作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无”执行权限”

注:该命令通常用命令“.”来替代。

如:source .bash_profile

. .bash_profile两者等效。

source(或点)命令通常用于重新执行刚修改的初始化文档。

source命令(从 C Shell 而来)是bash shell的内置命令。

点命令,就是个点符号,(从Bourne Shell而来)。

source的程序主体是bash,脚本中的$0变量的值是bash,而且由于作用于当前bash环境,脚本中set的变量将直接起效

sh, bash的命令用法:

sh/bash FileName

作用:打开一个子shell来读取并执行FileName中命令。该filename文件可以无”执行权限”

注:运行一个shell脚本时会启动另一个命令解释器.

每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
shell脚本也可以启动他自已的子进程.

这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.

在ubuntu中sh只是bash的一个链接。

由于是在子shell中执行,脚本设置的变量不会影响当前shell。

./的命令用法:

./FileName

作用:打开一个子shell来读取并执行FileName中命令。该filename文件需要”执行权限”

注:运行一个shell脚本时会启动另一个命令解释器.

每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.

这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.

shell脚本也可以启动他自已的子进程.

这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.

由于是在子shell中执行,脚本设置的变量不会影响当前shell。