学习札记

       1.4  学习札记

     vim    变量 shell 

   vim    文本编辑器 模式编辑器
   行编辑器  sed awk
   vim 主要三种模式: 命令模式:移动光标;剪切文本;改变模式
                      插入模式:修改文本(i 在光标处开始插入模式 I 在行

                     首插入  A 在行尾后补 a 在光标后补充内容 o 插入一个

                    新行在下面 O 插入一个新行在上面 c -change c+e c+$  

                     )
                      末行模式:保存、退出等等
    vim +n 文本  文本光标处于第几行
                    保存退出 :wq :x ZZ
                    不保存退出: :q  :q!
                        :w  path路径 当编辑文件路径有问题或更改时使用
   命令模式:
    按字符移动 arrow h j k l
    按单词移动 w e b     [o ^ $]
    按句移动   )( 
    按段移动 }{
    跳转第几行 xG (1G G)
     翻屏操作: ctrl+f/b/u/d
   cc 删除此行并转换到插入模式
   删除操作 d
            x(删除单个字符)Nx  X 删除光标之前字符
   复制 y (w $)  粘贴 p  P  替换 r
   移动字符 先dd在p    撤消操作 u  U
   重做 .  撤销撤销 ctrl+ r
   可视化模式 v/V
   扩展:末行模式
        :n 跳转n行     10,100 y +p  复制第十行到第100行的文本
        %y 全文复制 (1,$ y)
打开多个文件 vim file1  file2 
   :next(下一个) prev(前一个) first last
   :set nu nonu 显示行
   :set ai 自动缩进
   :syntax on/off  语法高亮显示
配置文件: /etc/vimrc
           -/.vimrc  用户家目录自己vim 配置文件
查找 /keyword ?keyword  n/N
替换:末行模式
   :s   :address ,address s ///
   :1,10 s /abc/ABC/
   globbing  命令行扩展
  1.~   2. {}扩展展开   3 `反引号 $()
   变量 :命名的存储空间
    bashshell  :1.不区分变量类型
                 2.不需要事先声明
声明变量 VARNAME =  
  引用 echo $VARNAME
  命名规则 : 1只能以字母下划线开头 2 只包含字母、数字和下划线 3 建议变

量名大写
  变量类型:1 本地变量 2 环境变量 (export printenv)3 特殊变量:bash内

置变量    4 位置变量
 某些通用变量
    PS1:bash 提示符的外观 默认状态[\u@\h \W]!$
    PATH :在其中查找可执行文件的目录
    EDITOR:默认文本编辑器
    HISTSIZE:bash 命令历史的命令数量 ~/.bash_history
    补充:which + command 可执行文件路径
         hash 已使用命令的执行路径历史
别名(alias)
   alias dir='ls -laf'
   取消别名 unalias dir
  取反义 /dir
 变量引用 ""弱引用  ''强引用
 命令替换 $()和``
 登陆shell和非登陆shell的启动配置不同
  登陆shell是:任何在登陆是创建的shell;su -
  非登录shell是: su;图形化终端;执行的脚本;任何其他shell实例
 bash启动脚本
启动脚本是bash启动时自动执行的脚本。用户可以把一些环境变量的设置和alias

、umask设置放在启动脚本中,这样每次启动Shell时这些设置都自动生效。思考

一下,bash在执行启动脚本时是以fork子Shell方式执行的还是以source方式执行

的?

启动bash的方法不同,执行启动脚本的步骤也不相同,具体可分为以下几种情况

1. 作为交互登录Shell启动,或者使用--login参数启动 请点评
交互Shell是指用户在提示符下输命令的Shell而非执行脚本的Shell,登录Shell

就是在输入用户名和密码登录后得到的Shell,比如从字符终端登录或者用

telnet/ssh从远程登录,但是从图形界面的窗口管理器登录之后会显示桌面而不

会产生登录Shell(也不会执行启动脚本),在图形界面下打开终端窗口得到的

Shell也不是登录Shell。

这样启动bash会自动执行以下脚本:

首先执行/etc/profile,系统中每个用户登录时都要执行这个脚本,如果系统管

理员希望某个设置对所有用户都生效,可以写在这个脚本里

然后依次查找当前用户主目录的~/.bash_profile、~/.bash_login和~/.profile

三个文件,找到第一个存在并且可读的文件来执行,如果希望某个设置只对当前

用户生效,可以写在这个脚本里,由于这个脚本在/etc/profile之后执

行,/etc/profile设置的一些环境变量的值在这个脚本中可以修改,也就是说,

当前用户的设置可以覆盖(Override)系统中全局的设置。~/.profile这个启动

脚本是sh规定的,bash规定首先查找以~/.bash_开头的启动脚本,如果没有则执

行~/.profile,是为了和sh保持一致。

顺便一提,在退出登录时会执行~/.bash_logout脚本(如果它存在的话)。

2. 以交互非登录Shell启动 请点评
比如在图形界面下开一个终端窗口,或者在登录Shell提示符下再输入bash命令,

就得到一个交互非登录的Shell,这种Shell在启动时自动执行~/.bashrc脚本。

为了使登录Shell也能自动执行~/.bashrc,通常在~/.bash_profile中调用

~/.bashrc:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi这几行的意思是如果~/.bashrc文件存在则source它。多数Linux发行版在创建

帐户时会自动创建~/.bash_profile和~/.bashrc脚本,~/.bash_profile中通常都

有上面这几行。所以,如果要在启动脚本中做某些设置,使它在图形终端窗口和

字符终端的Shell中都起作用,最好就是在~/.bashrc中设置。

下面做一个实验,在~/.bashrc文件末尾添加一行(如果这个文件不存在就创建它

):

export PATH=$PATH:/home/akaedu然后关掉终端窗口重新打开,或者从字符终端

logout之后重新登录,现在主目录下的程序应该可以直接输程序名运行而不必输

入路径了,例如:

~$ a.out就可以了,而不必

~$ ./a.out为什么登录Shell和非登录Shell的启动脚本要区分开呢?最初的设计

是这样考虑的,如果从字符终端或者远程登录,那么登录Shell是该用户的所有其

它进程的父进程,也是其它子Shell的父进程,所以环境变量在登录Shell的启动

脚本里设置一次就可以自动带到其它非登录Shell里,而Shell的本地变量、函数

、alias等设置没有办法带到子Shell里,需要每次启动非登录Shell时设置一遍,

所以就需要有非登录Shell的启动脚本,所以一般来说在~/.bash_profile里设置

环境变量,在~/.bashrc里设置本地变量、函数、alias等。如果你的Linux带有图

形系统则不能这样设置,由于从图形界面的窗口管理器登录并不会产生登录Shell

,所以环境变量也应该在~/.bashrc里设置。

3. 非交互启动
为执行脚本而fork出来的子Shell是非交互Shell,启动时执行的脚本文件由环境

变量BASH_ENV定义,相当于自动执行以下命令:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi如果环境变量BASH_ENV的值不

是空字符串,则把它的值当作启动脚本的文件名,source这个脚本。

4. 以sh命令启动
如果以sh命令启动bash,bash将模拟sh的行为,以~/.bash_开头的那些启动脚本

就不认了。所以,如果作为交互登录Shell启动,或者使用--login参数启动,则

依次执行以下脚本:

/etc/profile

~/.profile

如果作为交互Shell启动,相当于自动执行以下命令:

if [ -n "$ENV" ]; then . "$ENV"; fi如果作为非交互Shell启动,则不执行任

何启动脚本。通常我们写的Shell脚本都以#! /bin/sh开头,都属于这种方式。


 

你可能感兴趣的:(shell,变量,职场,vim,休闲)