shell命令收集

1.比较两个文件的时间戳可以用test的-nt选项, 比如 [ file1 -nt file ] && echo "file1 is newer than file2" ,然而 -ot 与之相反

2.虚拟机 设置 选项 共享文件夹 mount -t vmhgfs .host:/ /mnt/hgfs/

3. 在shell编程时,关于while循环的变量:

while循环中的变量在循环中有发生变化时,这个变量的值是可以在循环语句块外面获取到的,比如:

a=1

while :

do

 echo $a   #输出1

 a=2

 break

done

echo $a  #输出2

那么输出将是

1

2

所以while循环可以修改全局变量的值

但是 while read line不可以修改全局变量的值,因为它会创建一个子shell进行处理,由于子shell会继承父shell中的变量,所以在子shell可以获取父进程的变量,但是父shell获取不到子shell对变量的修改,比如:

a=1

echo "123" | while read line

do

echo $a  #输出1

a=$line

echo $a  #输出123

done

echo $a #输出1

输出结果将是:

空

123

1


总结:这个错误容易出现在使用while read line修改全局变量的情况,如果需要只用while read line 修改全局变量,可以尝试使用将该变量写入一个文件中,然后再while read line中将文件数据读取出来,处理完成后,将数据写回文件中让父进程读取。

也就是说while read line会创建一个子shell进行处理,而父shell会进入阻塞状态,等子shell处理完成后返回父shell的运行,虽然子shell可以继承父shell中的变量,但是子shell并不能直接将处理好后的变量返回给父shell,父子shell的通信方式一般是通过return返回结果,通过$?获取,或者将结果写入文件中,让fushell去读取。

其实shell中的每一个命令都可以看做是一个子shell,每一个函数或脚本也可以看做一个子shell,脚本则是这些子shell的集合。他们有的可以通过使用return返回处理的结果(比如函数和脚本),也可以将结果写入文件中以便读取。

下面收录了shell会创建子进程的情况:

1&,提交后台作业

用&符号作为命令执行的结尾时

If a command is terminated by the control operator `&', the shell executes the command asynchronously in a subshell.

2:管道

管道在自己的子shell中执行时

Each command in a pipeline is executed in its own subshell

3:括号命令列表

()操作符

将一些列命令放在()中执行时

     Placing a list of commands between parentheses causes a subshell

     environment to be created

4:执行外部脚本、程序:

执行在$PATH 中的命令时

When Bash finds such a file while searching the `$PATH' for a command, it spawns a subshell to execute it.  In other words, executing

                     filename ARGUMENTS

        is equivalent to executing

                   bash filename ARGUMENTS

 

说明:大致上子进程的创建包括以上四种情况了。需要说明的是只要是符合上边四种情况之一,便会创建(fork)子进程,不因是否是函数,命令,或程序,也不会因为是内置函数(buitin)或是外部程序。


此外,上边提到子进程创建与执行的二个步骤,shell子进程的创建在步骤之一并无多大差别,一般还是父进程调用fork产生进程环境,估在第二步exec的时候,是存在差别的。


shell做为解释语言程序,提供给第二步exec加载和执行的程序体并不是脚本本身,而是由第一行#!指定的,默认为shell程序,当然也可以是awk,sed等程序.


shell同时提供二种不创建子程序的进程创建方式

                         1source命令,使用方法

Source   filename ARGUMENTS

 filename ARGUMENTS

 此种方法,直接在当前shell进程中执行filename脚本,filename结束后继续返回当前shell进程

2exec命令,使用方法

Exec  filename ARGUMENTS

此种方法直接在当前shell进程中执行filname脚本,filename结束后退出当前shell进程


4. 关于alias别名

我们常常会在自己的.bashrc中给一些命令使用别名,可以通过alias来查看

[root@localhost ~]# alias
alias cp=’cp -i’
alias l.=’ls -d .* –color=auto’
alias ll=’ls -l –color=auto’
alias ls=’ls –color=auto’
alias mv=’mv -i’
alias rm=’rm -i’
alias which=’alias | /usr/bin/which –tty-only –read-alias –show-dot –show-tilde’

但是是有时候,我们不想用有别名的命令,而是想用最原始的命令,就可以用转义符号来暂时屏蔽别名,不让别名生效,从而使用其他的命令选项,比如

输入\cp命令,作用也是取消cp的别名。
[root@localhost ~]#\cp -fr src dest

[root@localhost ~]#\grep src dest

你可能感兴趣的:(shell)