现在的位置: 首页 > 综合 > 正文

shell学习2

2014年11月16日 ⁄ 综合 ⁄ 共 3723字 ⁄ 字号 评论关闭

 1. 首先介绍一个命令:fuser。之前很少用到,现在做个标记吧。

fuser命令在linux系统中用来根据文件或文件结构识别进程。

使用权限:

超级用户

语法格式:

fuser [ -c | -d | -f ] [ -k | -K { SignalNumber | SignalName }] [ -u ] [ -x ] [ -V ]File ...

使用说明:

此 fuser 命令列出了本地进程的进程号,那些本地进程使用 File 参数指定的本地或远程文件。

对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。

每个进程号后面都跟随一个字母,该字母指示进程如何使用文件。

c 将此文件作为当前目录使用。 

e 将此文件作为程序的可执行对象使用。 

r 将此文件作为根目录使用。 

s 将此文件作为共享库(或其他可装载对象)使用。 

进程号被写入标准输出(在进程号之间有空格的行中)。

一个换行符被写入标准错误(在每个文件操作数的最后一个输出之后)。其他所有输出被写入标准错误。

此 fuser 命令不会检测有 mmap 区域的进程,其中相关的文件描述符已从此被关闭。

主要参数:

-c 包含 File 的文件系统中关于任何打开的文件的报告。 

-d 暗示使用了 -c 和 -x 标志。

关于任何与文件系统(自父目录删除的)无链接的打开文件的报告。

当与 -V 标志一起使用时,它也会报告被删除文件的节点号和大小。 

-f 仅对文件的打开实例报告。 

-K SignalNumber | SignalName 将指定信号发送到每个本地进程。

仅有 root 用户能终止另一用户的进程。信号可以指定为信号名称(如 -9)或 KILL(用于 SIGKILL 信号)。

SignalName 的有效值是 kill -l 命令所显示的那些值。 

-k 将 SIGKILL 信号发送到每个本地进程。仅有 root 用户能终止另一用户的进程。 

注:

fuser -k 或 -K 可能无法检测和杀死程序开始运行后立即创建的新进程。 

-u 为进程号后圆括号中的本地进程提供登录名。 

-V 提供详细输出。 

-x 与 -c 或 -f 连用,报告除标准 fuser 输出以外的可执行的和可载入的对象。 

应用实例:

要列出使用 /etc/passwd 文件的本地进程的进程号,请输入: 

fuser /etc/passwd

要列出使用 /etc/filesystems 文件的进程的进程号和用户登录名,请输入: 

fuser -u /etc/filesystems

要列出正在使用已从给定文件系统删除的文件的全部进程,请输入: 

fuser -d /usr

    2. set的使用

    在脚本中set可以用来设置位置参数,如下例:

  1. #!/bin/bash 
  2.  
  3. # script "set-test" 
  4.  
  5. # 使用3个命令行参数来调用这个脚本, 
  6. # 比如, "./set-test one two three". 
  7.  
  8. echo 
  9. echo "Positional parameters before  set \`uname -a\` :" 
  10. echo "Command-line argument #1 = $1" 
  11. echo "Command-line argument #2 = $2" 
  12. echo "Command-line argument #3 = $3" 
  13.  
  14.  
  15. set `uname -a` # 把`uname -a`的命令输出设置 
  16.                # 为新的位置参数. 
  17.  
  18. echo $_        # unknown(译者注: 这要看你的uname -a输出了,这句打印出的就是输出的最后一个单词.) 
  19. # 在脚本中设置标志. 
  20.  
  21. echo "Positional parameters after  set \`uname -a\` :" 
  22. # $1, $2, $3, 等等. 这些位置参数将被重新初始化为`uname -a`的结果 
  23. echo "Field #1 of 'uname -a' = $1" 
  24. echo "Field #2 of 'uname -a' = $2" 
  25. echo "Field #3 of 'uname -a' = $3" 
  26. echo --- 
  27. echo $_        # --- 
  28. echo 
  29.  
  30. exit 0 

    不使用任何选项或参数来调用set命令的话, 将会列出所有的环境变量和其他所有的已经初始化过的变量

    set -- $variable  #将位置参数的内容设为变量"$variable"的内容,set --

如果没指定变量,那么将会unset所有的位置参数:

    

  1. #!/bin/bash 
  2.  
  3. variable="one two three four five" 
  4.  
  5. set -- $variable 
  6. # 将位置参数的内容设为变量"$variable"的内容. 
  7.  
  8. first_param=$1 
  9. second_param=$2 
  10. shift; shift        # 将最前面的两个位置参数移除. 
  11. remaining_params="$*" 
  12.  
  13. echo 
  14. echo "first parameter = $first_param"             # one 
  15. echo "second parameter = $second_param"           # two 
  16. echo "remaining parameters = $remaining_params"   # three four five 
  17.  
  18. echo; echo 
  19.  
  20. # 再来一次. 
  21. set -- $variable 
  22. first_param=$1 
  23. second_param=$2 
  24. echo "first parameter = $first_param"             # one 
  25. echo "second parameter = $second_param"           # two 
  26.  
  27. # ====================================================== 
  28.  
  29. set -- 
  30. # 如果没指定变量,那么将会unset所有的位置参数. 
  31.  
  32. first_param=$1 
  33. second_param=$2 
  34. echo "first parameter = $first_param"             # (null value) 
  35. echo "second parameter = $second_param"           # (null value) 
  36.  
  37. exit 0 

    3.常用的命令shell命令

declare, typeset: 用来指定或限制变量的属性.

readonly:declare -r作用相同, 设置变量的只读属性, 或者可以认为这个变量就是一个常量. 设置了这种属性之后, 如果你还要修改它, 那么将会得到一个错误信息. 这种情况与C语言中的const常量类型是相同的.

getopts:理解起来有点难,有时间好好研究下。

source:当在命令行中调用的时候, 这个命令将会执行一个脚本. 当在脚本中调用的时候,
source file-name 将会加载file-name文件. sourc一个文件(或点命令)将会在脚本中引入代码, 并将这些代码附加到脚本中(与C语言中的#include指令效果相同). 最终的结果就像是在使用"source"的行上插入了相应文件的内容.
在多个脚本需要引用相同的数据, 或者需要使用函数库的情况下, 这个命令非常有用.

exec:这个shell内建命令将使用一个特定的命令来取代当前进程.
一般的当shell遇到一个命令, 它会
forks off一个子进程来真正的运行命令. 使用exec内建命令, shell就不会fork了, 并且命令的执行将会替换掉当前shell.
因此, 在脚本中使用时, 一旦exec所执行的命令执行完毕, 那么它就会强制退出脚本。

caller:将caller命令放到函数中, 将会在stdout上打印出函数的调用者信息。

  1. #!/bin/bash 
  2. #caller 0 的作用 
  3.  
  4. function1 () 
  5. caller 0 #将显示调用者信息。 
  6.  
  7. function1 
  8.  
  9. caller 0 

type [cmd]:与外部命令which很相像,
type cmd将会给出"cmd"的完整路径. 与which命令不同的是,
type命令是Bash内建命令. -atype命令的一个非常有用的选项, 它用来鉴别参数是关键字还是内建命令, 也可以用来定位同名的系统命令. 

  1. [max@localhost shell]$ type cd 
  2. cd is a shell builtin 
  3. [max@localhost shell]$ which cd 
  4. /usr/bin/which: no cd in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/max/bin) 

实验结果好像是type cmd 将显示cmd的类型,which cmd将显示cmd的路径?
 

本文出自 “alkshao” 博客,请务必保留此出处http://alkshao.blog.51cto.com/1953382/508613

【上篇】
【下篇】

抱歉!评论已关闭.