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同时提供二种不创建子程序的进程创建方式
1:source命令,使用方法
Source filename ARGUMENTS
或
. filename ARGUMENTS
此种方法,直接在当前shell进程中执行filename脚本,filename结束后继续返回当前shell进程
2:exec命令,使用方法
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