Linux下的shell与make
一、shell
1.1 什么是shell
● 用户与Linux的接口
● 命令解释器
● 支持多用户
● 支持复杂的编程语言
● Shell有很多种,如:csh,tcsh,pdksh,ash,sash,zsh,bash等。Linux的缺省Shell为bash(Bourne Again Shell)。
Shell是用户和操作系统之间最主要接口。通过Shell,可以同时在后台运行多个应用程序,并且在把需要与用户交互的程序放在前台运行。
通过在多条命令的序列中使用变量和流程控制,Shell可以作为一名复杂的编程语言。
1.2 转义字符和通配字符
● 转义字符(metacharacters)指的是在Shell中有特殊含义的字符。
例如:< > | ; ! ? * [ ] $ \ " ' ` ~ ( ) { } ^
#ls file[1-10].c
#count=`ls –l | grep ‘^d’| wc –l`
● 通配字符(wildcards)是转义字符的子集,用来查找匹配文件名
例如:? * [] [-] [!]
● 使用
通配一个字符:"?"
通配多个字符:"*"
1.3 输入输出重定向
● 系统定义三个标准文件:标准输入(stdin)、标准输出(stdout)、标准错误输入(stderr)
● 管道符:"|",将前一个命令的输出转成下一个命令的输入。
● 过滤器(filters):用来接收标准输入,经过一定的转化,再写到标准输出。所以,过滤器一般放在管道符中间。
每个程序起动时,就有三个文件描述:STDIN (0),STDOUT(1),STDERR(2)。用"<"改变输入,用">"改变输出,用"2>"改变错误输出,用">>"来追加到已有的文件中。
常用的过滤器如下:expand,sed,awk,fmt,tac,tr,grep,nl,pr。
tee命令接收标准输入并将数据输出到标准输出和一个文件内。
多条命令可以输入到一行中,并用";"字符分隔。在一行命令后加"\"表示另起一行继续输入,下一行的提示符变为">"
printf(“\t”);
1.4 Shell变量
● Shell变量(Variables)是程序用来保存数据用的。
● Shell特殊变量:系统定义了一些特殊的变量。如$HOME等。使用set命令查看当时系统中定义的变量。
系统定义的特殊变量有:$TERM(当前终端类型),$PATH(命令的搜索路径),$MANPATH (手册页存放的目录),$HOME(用户主目录),$LANG(当前使用语言),$PS1,$PS2(命令提示符),$SHELL(当前Shell名)。
在命令行上打入:变量名=变量值,可以定义变量。使用 echo $变量名查看变量值。使用 unset 取消对变量的定义。
#hello=”123”
单引号表示忽略其中所有的转义字符,双引号表示忽略其中除了 $ ` \ 以外的其他的转义字符。反斜线(\)表示忽略下一个转义字符。
多条命令可以输入到一行中,并用";"字符分隔。在一行命令后加"\"表示另起一行继续输入,下一行的提示符变为">"
● Shell系统变量
$?:最近执行的命令返回的值;
$$:本进程的进程号
$!:最近后台进程号
$#:shell自变量个数,$1表示第一个自变量
● Shell用户变量
#varname=value :赋值
#readonly varname :标记只读
#export varname :标记移出:变量可以被子进程继承
#setenv PATH=/home:/usr:/etc:/bin:/usr/bin: (csh中)
#varname=` expr $varname + 1 ` :变量值增1 #x=$[ $x + 1 ]
#echo $PATH
1.5 定制用户环境
● 用户在登录Shell时,会依次执行一系列的脚本。
● 使用alias命令,可以定义一些别名。
Alias ‘rm –f’ rm
登录BASH时,用户将依次执行一系列的脚本:/etc/profile , $HOME/.bash_profile ( 如果没有,执行 $HOME/.bash_login ,还没有,执行 $HOME/.profile)。注销时,会自动执行 $HOME/.bash_logout 。
使用 redhat 的用户,登录时除了这两个文件以外,还会自动执行 $HOME/.bashrc ,这个文件又会再执行 /etc/bashrc
1.6 条件控制
1)test命令
测试文件、变量的属性,表达式的值,或命令执行返回值。
test –d /usr → [ -d /usr ]
test –f .bashrc → [ -f .bashrc ]
test $count –gt 0 → [ $count –gt 0 ]
2)if语句
if (expression) then
command-list
else
command-list
fi
3)case语句
case $var in
pattern1) command-list ;;
pattern2) command-list ;;
…
esac
4)逻辑运算符&& 和||
# test –f myfile.c && echo ―file found‖
if test –f myfile.c then
echo ―file found‖
fi
# test –f myfile.c | | echo ―file not found‖
if test ! –f myfile.c then
echo ―file not found‖
fi
1.7 循环控制
1)for语句
for var in word-list
do
command-list
done
for count in 1 2 3
do
echo $I
done
for var
do
2)while语句
while (expression)
do
command-list
done
#greeting=‘hello world‘
i = 1
while test $i –le 100 ; do
case $i in
*0) echo ―**********‖>file$i ;;
*) echo $i > file$i ;;
esac
i = ` expr $i + 1 `
done
例:append命令的实现:
case $# in
1)cat >> $1 ;;
2)cat < $1>> $2 ;;
*) echo ?usage: append [from] to ‘;;
esac
#chmod +x myappend
#myappend file1 file2
1.8函数
functionname( )
{
command-list
}
usage()
{
echo ―usage: (1)
}
usage ―from … to ―
注意:函数的使用就象可执行程序一样,但必须先定义,后使用。
1.9 here文档
here文档指在shell脚本中指定输入源,而不是来自文件或标准输入,其中的“<<”是here文档保留字。
# mail cindy << !@$
happy birthday
I love you
!@$
1.10 shell内部命令:不产生子进程
1) eval:在shell程序中,利用变量的值来构建命令
A=ls
B= ? | wc -w‘
eval $A$B
2) exec:转去执行exec后命令,不建立新进程,也不返回到当前的执行过程,相当于go to 语句。
#cat execdemo
exec date
echo hello
3) read:从标准输入设备(键盘)读入一行,并把读入的字依次赋给各变量,所有剩余的字赋给最后一个变量。
#cat parrot
echo ―you say:\c‖
read what
echo ―I repeat:$what‖
4) shift:使命令行参数向左移动一位,并使记录参数总数的变量$#减1
#cat shiftdemo
while test $# != 0
do
echo $1 $2 $3
shift
done
#shiftdemo a b c
a b c
b c
c
5)wait:等待当前进程所有子进程结束,若wait后跟参数n,则等待进程n结束。
#cat waitdemo
echo ―This is a new file‖
(sleep 5; date)&
wait
echo ―the file terminate‖
执行结果:
This is a new file
April 20 10:08:26 BJT 2002-04-20
The file terminate
6) trap:中断处理命令
trap 命令表中断信号表
#cat trapfile
trap echo ? This is INT 2‘ 2
trap echo ? This is INT 3‘ 3
for I in /bin /bin/usr
do
echo $I
done
下面程序实现scan:扫描当前目录下的每一个子目录,并执行用户提交的命令:d=`pwd`
for i in *
do
if test –d $d/$i
then
cd $d/$i
while echo ―$i:‖
trap exit 2
read x
do trap : 2 ; eval $x; done
fi
done
7)点命令.
在bsh利用. 命令执行一个命令时,不创建子进程。(csh中用source)
8)空命令:不做任何事情
1.11 shell程序实例
下面程序dircmp测试当前目录与指定目录是否含有相同文件数
if test $# -ne 1 then
echo ―Usage:dircmp dirname‖
exit 1
else if test !-d $1 then
echo ―\‖$1\‖ is not a directory‖
exit 1
else
this = `ls –l |grep ?^-‘ | wc –l `
that = `ls –l $1 |grep ?^-‘ | wc –l `
if test $this –ne $that then
echo ―Current directory and \‖$1\‖ do not match‖
else
echo ―Current directory and \‖$1\‖ have same number of files‖
fi
fi
fi
#dircmp abc
―abc‖ is not a directory
1.12 shell程序的执行方法:
1) $chmod u+x dircmp
$./dircmp /usr/bin
2) $sh dircmp
3) $sh < dircmp
4) $ . dircmp(用点命令执行程序,不创建子进程)
%source dircmp(csh中)
二、make
2. 1 make
大型程序维护工具
Makefile 或makefile: 告诉make维护一个大型程序,该做什么。Makefile说明了组成程序的各模块间的相互关系及更新模块时必须进行的动作,make按照这些说明自动地维护这些模块。
在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:
network: network.o subrs.o (1)
cc –o network network.o subrs.o (2)
network.o: network.c netdefs.h (3)
cc –c network.c (4)
subrs.o: subrs.c netdefs.h (5)
cc –c subrs.c (6)
其中(3)—(6)可以简化为:(隐含的规则)
network.o subrs.o: netdefs.h
#make
#make network
#make –f makefile
2.2 makefile要点
(1)宏(变量)
CC=gcc
$(CC) test.c
$@: current target
$<:first prerequisite
$^:all prerequisites
(2)后缀规则(suffix rules)
.c.o:
$(CC) -c $(CFLAGS) -o $@ $<
(3)模式规则(pattern rules)
%.o:%.c
$(CC) -c $(CFLAGS) -o $@ $<
(4)通配符*
objects = *.o
objects := $(wildcard *.o)
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
(5)phony target(哑/假目标):不对应实际的文件,只是一个目标
.PHONY: clean #如果这行不加,若当前目录下有一个clean文件,则make clean 没有动作clean: #这是phony target
rm *.o temp
(6)include filename:嵌套makefile,暂停当前makefile,转而读取指定的filename -include filename:忽略找不到filename时的错误
(7)控制语句:ifeq, ifneq
?1) 為何叫做 shell ? 在介紹 shell 是甚麼東西之前,不妨讓我們重新檢視使用者與電腦系統的關係: 圖(FIXME) 我們知道電腦的運作不能離開硬體,但使用者卻無法直接對硬體作驅動, 硬體的驅動只能透過一個稱為"作業系統(Operating System)"的軟體來控管, 事實上,我們每天所談的 linux ,嚴格來說只是一個作業系統,我們稱之為"核心(kernel)"。 然而,從使用者的角度來說,使用者也沒辦法直接操作 kernel , 而是透過 kernel 的"外殼"程式,也就是所謂的 shell ,來與 kernel 溝通。 這也正是 kernel 跟 shell 的形像命名關係。如圖: 圖(FIXME) 從技術角度來說,shell 是一個使用者與系統的互動界面(interface), 主要是讓使用者透過命令行(command line)來使用系統以完成工作。 因此,shell 的最簡單的定義就是---命令解譯器(Command Interpreter):* 將使用者的命令翻譯給核心處理, * 同時,將核心處理結果翻譯給使用者。 每次當我們完成系統登入(log in),我們就取得一個互動模式的 shell ,也稱為 login shell 或 primary shell。 若從行程(process)角度來說,我們在 shell 所下達的命令,均是 shell 所產生的子行程。這現像,我們暫可稱之為 fork 。 如果是執行腳本(shell script)的話,腳本中的命令則是由另外一個非互動模式的子 shell (sub shell)來執行的。 也就是 primary shell 產生 sub shell 的行程,sub shell 再產生 script 中所有命令 的行程。(關於行程,我們日後有機會再補充。) 這裡,我們必須知道:kernel 與 shell 是不同的兩套軟體,而且都是可以被替換的:
Shell Shell 就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。 4.1.1 Shell 的基本概念 1. 什么是S hell Shell 就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。Shell 在L inux 系统中具有极其重要的地位,如图4-1 所示
第 4 章 Shell 与 V i 编辑器 - 71 - diff grep vi multitasking sh gcc device hardware interface kernn e l TCP/IP stack bash utilii t es 图 4-1 Linux 系统结构组成 2. Shell 的功能 Shell 最重要的功能是命令解释,从这种意义上来说,Shell 是一个命令解释器。Linux 系统中的所有可执行文件都可以作为 Shell 命令来执行。将可执行文件作一个分类,如表 4-1 所示。 表 4-1 可执行文件的分类 部的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或实用程序就试图 在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。在 查找该命令时分为两种情况: 用户给出了命令路径,Shell 就沿着用户给出的路径查找,若找到则调入内存,若没有 则输出提示信息; 用户没有给出命令的路径,Shell 就在环境变量 PATH 所制定的路径中依次进行查找, 若找到则调入内存,若没找到则输出提示信息。 图 4-2 描述了 S hell 是如何完成命令解释的。
SecureCRT 常用命令 2010年4月26日 | 分类: Linux | 标签: SecureCRT 常用命令: 一、ls 只列出文件名(相当于dir,dir也可以使用) -A:列出所有文件,包含隐藏文件。 -l:列表形式,包含文件的绝大部分属性。 -R:递归显示。 –help:此命令的帮助。 二、cd 改变目录 cd /:进入根目录 cd :回到自己的目录(用户不同则目录也不同,root为/root,xxt为/home/xxt cd ..:回到上级目录 pwd:显示当前所在的目录 三.less 文件名:查看文件内容。 四.q 退出打开的文件。 五.上传文件: rz 选择要传送的文件,确定。 六.下载文件: sz 指定文件名,enter敲,即下载到了secureCRT/download目录下。 七:删除文件: rm 删除文件,rmdir 删除空目录。 八.显示最近输入的20条命令:history 20 九.获得帮助命令–help查看命令下详细参数:如:rz –help , sz –help 。 十.cd 进入某个文件夹的命令: mkdir+文件夹名创建某个文件夹的命令 sz+文件名从服务器端向本机发送文件的命令 rz 从本机向服务器端传送文件的命令 ll 列出当前目录下的所有文件,包括每个文件的详细信息 dir 对当前文件夹 vi 打开当前文件 十一.在编辑某个文件的时候: a 切换到编辑模式 ctrl+c 退出编辑模式
dd 删除整行 :q 退出当前文件 :w 写入并保存当前文件 -f 强行xx的参数。。。 其它命令: 1.ps -ef //查看server的进程,以列表形式显示的server进程。 ps 显示当前在系统运行的进程 /usr/bin/ps [选项] -e 显示每个现在运行的进程 -f 生成一个完全的列表 实际操作: ————————————– 1 SSH客户端连接到10.5.1.55系统(参见《启动远程客户端说明SecureCRT.doc》) $ cd /home/bea2/user_projects/csdomain/bin 2 查看weblogic92服务进程 $ ps -eaf | grep weblogic bea2 327926 331940 0 13:08:45 pts/4 0:00 grep weblogic webadmin 421908 368956 0 Sep 24 - 4:13 /usr/java5_64/bin/java -Xms256m -Xmx512m -da -Dplatform.home=/home/weblogic/bea/weblogic92 -Dwls.home=/home/weblogic/bea/weblogic92/server -Dwli.home=/home/weblogic/bea/weblogic92/integration -Dweblogic.management.discover=true -Dwlw.iterativeDev=false -Dwlw.testConsole=false -Dwlw.logErrorsToConsole= -Dweblogic.ext.dirs=/home/weblogic/bea/patch_weblogic923/profiles/de fault/sysext_manifest_classpath https://www.wendangku.net/doc/c15238348.html,=AdminServer -Djava.security.policy=/home/weblogic/bea/weblogic92/server/lib/webl ogic.policy weblogic.Server bea2 491796 385044 17 00:12:50 pts/6 182:55 /usr/java5_64/bin/java -Xms6g -Xmx8g -javaagent:/home/bea2/user_projects/csdomain/Introscope/wily/Agent.j ar -Dcom.wily.introscope.agentProfile=/home/bea2/user_projects/csdomain /Introscope/wily/IntroscopeAgent.profile -Dcom.wily.introscope.agent.agentName=AdminServer -da -Dplatform.home=/home/weblogic/bea/weblogic92 -Dwls.home=/home/weblogic/bea/weblogic92/server -Dwli.home=/home/weblogic/bea/weblogic92/integration
Shell 十三问 作者:https://www.wendangku.net/doc/c15238348.html,之網中人 详细讨论在: https://www.wendangku.net/doc/c15238348.html,/forum/viewtopic.php?t=218853&postdays=0&postorder=asc&start=0 1) 为何叫做shell ? 在介绍shell 是甚么东西之前,不妨让我们重新检视使用者与计算机系统的关系: 图(FIXME) 我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动, 硬件的驱动只能透过一个称为"操作系统(Operating System)"的软件来控管, 事实上,我们每天所谈的linux ,严格来说只是一个操作系统,我们称之为"核心(kernel)"。然而,从使用者的角度来说,使用者也没办法直接操作kernel , 而是透过kernel 的"外壳"程序,也就是所谓的shell ,来与kernel 沟通。 这也正是kernel 跟shell 的形像命名关系。如图: 图(FIXME) 从技术角度来说,shell 是一个使用者与系统的互动界面(interface), 主要是让使用者透过命令行(command line)来使用系统以完成工作。 因此,shell 的最简单的定义就是---命令解译器(Command Interpreter): * 将使用者的命令翻译给核心处理, * 同时,将核心处理结果翻译给使用者。 每次当我们完成系统登入(log in),我们就取得一个互动模式的shell ,也称为login shell 或primary shell。 若从行程(process)角度来说,我们在shell 所下达的命令,均是shell 所产生的子行程。这现像,我们暂可称之为fork 。 如果是执行脚本(shell script)的话,脚本中的命令则是由另外一个非互动模式的子shell (sub shell)来执行的。 也就是primary shell 产生sub shell 的行程,sub shell 再产生script 中所有命令的行程。(关于行程,我们日后有机会再补充。) 这里,我们必须知道:kernel 与shell 是不同的两套软件,而且都是可以被替换的: * 不同的操作系统使用不同的kernel , * 而在同一个kernel 之上,也可使用不同的shell 。 在linux 的预设系统中,通常都可以找到好几种不同的shell ,且通常会被列于如下档案里:/etc/shells 不同的shell 有着不同的功能,且也彼此各异、或说"大同小异"。 常见的shell 主要分为两大主流: sh: burne shell (sh)
实验一Linux shell基本命令的使用 一、实验目的和要求 a)掌握用户系统常用命令。 b)掌握文件目录常用命令。 c)掌握压缩打包常用命令。 d)掌握网络相关命令。 二、实验内容和原理 a)登录系统,查看系统相关信息; b)查询和更新系统用户数据; c)创建文件目录和文件,并实现文件操作; d)打包并解压文件 e)查询系统网络状态,并设置和更新 三、实验环境 a)硬件:PC机 b)软件:LINUX操作系统、虚拟机 四、算法描述及实验步骤 a)启动系统,打开终端; b)查看系统信息,并将以下查看内容重定向添加到文件systemInfo.txt,最后清屏: 1、查看系统当前所有进程; 2、查看当前系统信息 3、查看硬盘分区情况 4、查看/etc/fstab文件 5、查看系统当前的网络地址 c)系统用户数据: 1、切换到root状态 2、创建用户(姓名拼间首字母加学号后两位,如张飞ZF01),密码是123456 3、进入新用户,并查看默认所在主目录及所有登录系统的用户 d)文件操作: 1、在当前用户的主目录下,创建文件夹Labl 2、进入Lab1文件夹,新建文件welcome.txt,写入“Hello Zhang Fei!”保存退出 3、将b步骤生成的文件SystemInfo.txt,移动到Lab1文件夹,并设置文件权限为:文件所有者可读写,其它为只读; 并查看文件列表,权限是否设置 4、返回到当前用户的主目录 5、将Lab1文件夹打包生成tar.gz文件,并删除原文件夹 五、实验报告要求: 按实验步骤执行,在纸质实验报告上详细描述执行流程(使用命令及操作流程),并在电子版的实验报告上要求另加适当截图描述; a)启动系统,打开终端;或使用putty连接系统(如果未安装ssh,可以使用sudo
ubuntu shell 使用命令大全 前言 下面的命令大都需要在控制台/ 终端/ shell 下输入。 控制台, 终端, 和shell 意味着同样一件事- 一个命令行界面,他可以用来控制系统。 打开一个控制台: 应用程序--> 附件--> 终端 任何一个使用'sudo' 作为前缀的命令都需要拥有管理员(或root) 访问权限。所以你会被提示输入你自己的密码。 安装升级 查看软件xxx安装内容 dpkg -L xxx 查找软件库中的软件 apt-cache search 正则表达式 或 aptitude search 软件包 显示系统安装包的统计信息 apt-cache stats 显示系统全部可用包的名称 apt-cache pkgnames 显示包的信息 apt-cache show k3b 查找文件属于哪个包 apt-file search filename 查看已经安装了哪些包 dpkg -l 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 sudo apt-cdrom add 系统升级 sudo apt-get update (这一步更新包列表) sudo apt-get dist-upgrade (这一步安装所有可用更新) 或者 sudo apt-get upgrade (这一步安装应用程序更新,不安装新内核等) 清除所有已删除包的残馀配置文件 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。 dpkg: --purge needs at least one package name argument Type dpkg --help for help about installing and deinstalling packages [*]; Use `dselect' or `aptitude' for user-friendly package management; Type dpkg -Dhelp for a list of dpkg debug flag values; Type dpkg --force-help for a list of forcing options; Type dpkg-deb --help for help about manipulating *.deb files; Type dpkg --license for copyright license and lack of warranty (GNU GPL) [*]. Options marked [*] produce a lot of output - pipe it through `less' or `more' ! 编译时缺少h文件的自动处理 sudo auto-apt run ./configure 查看安装软件时下载包的临时存放目录
习题07_Shell编程 一、单选 1. 下面哪个命令是用来定义shell的全局变量( D )。 A. exportfs B. alias C. exports D. export 2.在Shell脚本中,用来读取文件内各个域的内容并将其赋值Shell变量的命令是(D )。 A. fold B. join C. tr D. read 3. 当字符串用双引号(’’)括起来时,SHELL将(C )。 A. 解释引号内的特殊字符 B. 执行引号中的命令 C. 不解释引号内的特殊字符 D. 结束进程 4. 以下哪个环境变量表示当前路径( B )。 A. PATH B. PWD C. HOME D. ROOT 5. shell不仅是(用户命令的解释器),它同时也是一种功能强大的编程语言,(bash )是Linux的缺省shell。 6. 编写的Shell程序运行前必须赋予该脚本文件(执行)权限。 7. 对于Shell脚本程序,若输入参数数量多于9个,则程序遍历每个参数可通过使用(shift )命令实现。 8. 为脚本程序指定执行权的命令及参数是( chmod a+x filename )。 9. 在shell编程时,使用方括号表示测试条件的规则是:方括号两边必有(空格)。 10. 输入了Shell命令的部分字符后按( tab )键可补全其余部分。 11.改变命令提示符的环境变量是(PS1 )。 11. grep -E '[Hh]enr(y|ietta)' file的功能是:(在文件File中查找Henry、henry、Henrietta或henrietta)。 12. 如下为命令终端下的一个截图: 则,以下两句的执行结果是:(the home path is $HOME )。 path=‘the home path is $HOME’ echo $path 13. 以下为程序名为prog的程序内容。则sh prog a b c d的执行结果为( C )。 set A B C D shift shift echo $1 三、简答 1. 下面给出了一个SHELL程序,试对其行后有#(n)形式的语句进行解释,并说明程序完成的功能。
Shell命令行操作 Linux shell 简介 Linux shell指的是一种程序,有了它,用户就能通过键盘输入指令来操作计算机了。Shell会执行用户输入的命令,并且在显示器上显示执行结果。这种交互的全过程都是基于文本的,与其他各章介绍的图形化操作不同。这种面向命令行的用户界面被称为CLI(Command Line interface)。在图形化用户界面(GUI)出现之前,人们一直是通过命令行界面来操作计算机的。 现在,基于图形界面的工具越来越多,许多工作都不必使用Shell就可以完成了。然而,专业的Linux用户认为Shell是一个非常有用的工具,学习Linux时一定要学习Shell,至少要掌握一些基础知识和基本的命令 启动shell 在启动Linux桌面系统后,Shell已经在后台运行起来了,但并没有显示出来。如果想让它显示出来, 按如下的组合键就可以:
是等效的。“系统终端”启动后是一个命令行操作窗口,可以随时放大缩小,随时关闭,比较方便,推荐使用。启动“系统终端”的方法是: 【开始】→【应用程序】→【附件】→【系统终端】 该软件允许建立多个Shell客户端,它们相互独立,可以通过标签 在彼此之间进行切换。 Shell命令基本规则 一般格式 Shell命令的一般格式如下: 命令名【选项】【参数1】【参数2】... 【选项】是对命令的特别定义,以减号(-)开始,多个选项可以用一个减号(-)连起来,如ls -l -a与 ls -la 相同。 【参数】提供命令运行的信息,或者是命令执行过程中所使用的文件名。 使用分号(可以将两个命令隔开,这样可以实现一行中输入多个命令。命令的执行顺序和输入的顺序 相同。 命令补全 在送入命令的任何时刻,可以按
SHELL的字符替换 SHELL的字符替换 shell的字符替换 变量替换: 一:简单赋值和替换 a=bcd $ echo $a bcd $ echo ${a} ???? bcd 二:变量扩充 除了shell中的meta,其它的[^a-zA-Z0-9_]几乎都可以作单词边界。同sed中关于单词边界[^a-zA-Z0-9_]的描述。 https://www.wendangku.net/doc/c15238348.html,/forum/24/20040825/393964.html 这些功能有时候会在程序中有意想不到的作用! 例如: $ a=bcd $ echo ${a}.b bcd.b $ echo $a.php bcd.php $ echo $a%b bcd%b $ echo /$a/bc /bcd/bc 对于shell中的meta字符,则backslash。 $ echo $a\*b bcd*b 三:变量中的变量 $ a=bcd $ b=efg $ c=$a$b $ echo $c bcdefg $ d=$c.ghi $ echo $d
bcdefg.ghi 思考:若变量互相嵌套,会怎样呢? 四:变量的特异功能 到网中人的啦!(ps:重写真是没激情啊) file=/dir1/dir2/dir3/my.file.txt 我们可以用${ } 分别替换获得不同的值: ${file#*/}:从变量file的字符串左边开始,删除字符直到第一个“/”:dir1/dir2/dir3/my.file.txt ${file##*/}:从变量file的字符串左边开始,删除字符直到最后一个“/”:my.file.txt ${file#*.}:从变量file的字符串左边开始,删除字符直到第一个“.”:file.txt ${file##*.}:从变量file的字符串左边开始,删除字符直到最后一个“.”:txt 其实,在“#”后面,无非就是一个匹配问题,不限于两个,你可以放任意个字符,还可以用shell中另外的通配符“?”“[…]”“[!…]”,例如: $ echo ${file#????} 1/dir2/dir3/my.file.txt $ echo ${file#*[0-9]} /dir2/dir3/my.file.txt $ echo ${file#/dir1/dir[0-9]} /dir3/my.file.txt “#”:相当于最小匹配,遇到一个最小的符合其后表达式的字符串(单个或多个)即中止匹配动作; “##”:相当于最大匹配,它尽可能的匹配更多的字符。 我们可以拿“*”来说明: * 在shell中表示匹配任何符号包括空。当它在只有一个# 的变量替换中,受最小匹配的影响,它不会匹配任何可打印字符,只匹配一个空,也就是什么也不匹配,你完全可以忽略它的存在; 当在有两个## 的变量替换中,受最大匹配的影响,一个* 表示匹配整个字符串。 如果想匹配字符“*”时,要在“*”前加一个“\”,其后的“*”失去通配符的功能。 但是还有一种例外情况(请接着看) 例: $ file2=abcd.efgh.ijkl.oopp $ echo ${file2#*.*.*.*} $ echo ${file2##*.*.*.*} 想想上面两个的输出是什么? $ echo ${file2#*.*.*.*} oopp $ echo ${file2##*.*.*.*} 空 ??知道为什么吗?因为:“*”匹配任何符号包括空。遇到一个“#”时,最后一个“*”就匹配“空”去了。看下面的: $ echo ${file2#*.*.*.?} opp $ echo ${file2#*.*.*.?*} opp
转自ChinaUnix 1) 为何叫做shell ? 在介绍shell 是甚么东西之前,不妨让我们重新查看用户与计算机系统的关系: 图(FIXME) 我们知道计算机的运作不能离开硬件,但用户却不能直接对硬件作驱动, 硬件的驱动只能通过一个称为"操作系统(Operating System)"的软件来控管, 事实上,我们每天所谈的linux ,严格来说只是一个操作系统,我们称之为"核心(kernel)"。 然而,从用户的角度来说,用户也没办法直接操作kernel , 而是通过kernel 的"外壳"程序,也就是所谓的shell ,来与kernel 沟通。 这也正是kernel 跟shell 的形像命名关系。如图: 图(FIXME) 从技术角度来说,shell 是一个用户与系统的交互界面(interface), 主要是让用户通过命令行(command line)来使用系统以完成工作。 因此,shell 的最简单的定义就是---命令解释器(Command Interpreter): * 将用户的命令翻译给核心处理, * 同时,将核心处理结果翻译给用户。 每次当我们完成系统登录(log in),我们就取得一个交互模式的shell ,也称为login shell 或primary shell。 若从进程(process)角度来说,我们在shell 所下达的命令,均是shell 所产生的子进程。这现像,我们暂可称之为fork 。 如果是执行脚本(shell script)的话,脚本中的命令则是由另外一个非交互模式的子shell (sub shell)来执行的。 也就是primary shell 产生sub shell 的进程,sub shell 再产生script 中所有命令的进程。 (关于进程,我们日后有机会再补充。) 这里,我们必须知道:kernel 与shell 是不同的两套软件,而且都是可以被替换的: * 不同的操作系统使用不同的kernel , * 而在同一个kernel 之上,也可使用不同的shell 。 在linux 的缺省系统中,通常都可以找到好几种不同的shell ,且通常会被列与如下文件里: /etc/shells 不同的shell 有著不同的功能,且也彼此各异、或说"大同小异"。 常见的shell 主要分为两大主流: sh: burne shell (sh) burne again shell (bash) csh: c shell (csh) tc shell (tcsh) korn shell (ksh) (FIXME) 大部份的Linux 系统的缺省shell 都是bash ,其原因大致如下两点: * 自由软件 * 功能强大 bash 是gnu project 最成功的产品之一,自推出以来深受广大Unix 用户喜爱, 且也逐渐成为不少组织的系统标准。 2) shell prompt(PS1) 与Carriage Return(CR) 的关系? 当你成功登录进一个文字界面之后,大部份情形下, 你会在荧幕上看到一个不断闪烁的方块或下划线(视不同版本而别), 我们称之为*光标*(cursor)。 光标的作用就是告诉你接下来你从键盘输入的按键所插入的位置, 且每输如一键光标便向右边移动一个格子,若连续输入太多的话,则自动接在下一行输入。
suse linux 常用命令 (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以.doc结尾的所有文件 (2)命令cp——复制文件 cp afile afile.bak 把文件复制为新文件afile.bak cp afile /home/bible/ 把文件afile从当前目录复制到/home/bible/目录下 cp * /tmp 把当前目录下的所有未隐藏文件复制到/tmp/目录下 cp -a docs docs.bak 递归性地把当前目录下的docs目录复制为新目录docs.bak,保持文件属性,并复制所有的文件,包括以句点开头的隐藏文件。为了方便起见,-a选项包含-R 选项 cp -i 在覆盖前询问用户 cp -v 告诉用户正在做什么 (3)命令mv——移动和重命名文件 mv aflie bfile 将afile重命名为bfile mv afile /tmp 把当前目录下的afile移动到/tmp/目录下 (4)命令rm——删除文件和目录 rm afile 删除文件afile rm * 删除当前目录下的所有文件(未隐藏文件)。rm命令不删除目录,除非也指定了-r(递归)参数。 rm -rf domed 删除domed目录以及它所包含的所有内容 rm -i a* 删除当前目录下所有以字母a开头的文件,并且在每次删除时,提示用户进行确认 (5)命令cd——更改目录 cd ~ 切换到主目录 cd /tmp 切换到目录/tmp cd dir切换到当前目录下的dir目录 cd /切换到根目录 cd ..切换到到上一级目录 cd ../..切换到上二级目录 cd ~切换到用户目录,比如是root用户,则切换到/root下 (6)命令mkdir——建立目录 mkdir phots 在当前目录中建立名为photos的目录 mkdir -p this/that/theother 在当前目录下建立指定的嵌套子目录 (7)命令mkdir——删除目录 mkdir 将删除空目录 (8)命令more、less——查看文件内容 more /etc/passwd 查看/etc/passwd的内容 功能:分页显示命令
Linux 操作系统Shell常用命令总结(linux系统) linux软件开发 1. find find pathnam e -options [-print -exec -ok] 让我们来看看该命令的参数: pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print find命令将匹配的文件输出到标准输出。 -exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格, 注意一定有分号结尾。 0) -ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 find . -name "datafile" -ctime -1 -exec ls -l {} \; 找到文件名为datafile*, 同时创建实际为1天之内的文件, 然后显示他们的明细. find . -name "datafile" -ctime -1 -exec rm -f {} \; 找到文件名为datafile*, 同时创建实际为1天之内的文件, 然后删除他们. find . -name "datafile" -ctime -1 -ok ls -l {} \; 这两个例子和上面的唯一区别就是-ok会在每个文件被执行命令时提示用户, 更加安全. find . -name "datafile" -ctime -1 -ok rm -f {} \; 1) find . -name 基于文件名查找,但是文件名的大小写敏感. find . -name "datafile*" 2) find . -iname 基于文件名查找,但是文件名的大小写不敏感. find . -iname "datafile*"
1.L inux动态库和静态库的区别 1.什么是库 在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 2.库的种类 linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。 静态库在程序编译时会被连接到目标代码中,目标程序运行时将不再需要该动态库,移植方便,体积较大,但是浪费空间和资源,因为所有相关的对象文件与牵涉到的库被链接合成一个可执行文件。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此体积较小,可以实现进程间的资源共享,甚至可以真正做到链接载入完全由程序员在程序代码中控制,另外将一些程序的升级变得简单,但是在程序运行时需要动态库存在。 3.库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。 4.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库 例如:$gcc -c hello.c $ ar crs libmyhello.a hello.o 动态库的后缀是.so,它由gcc加特定参数编译产生。 例如:$gcc -c hello.c $ gcc -shared -fPIC -o libmyhello.so hello.o 参数解析:
北京联合大学 《操作系统课程设计》实验一:命令行解释程序 学院:信息学院专业:计算机科学与技术 课程:操作系统班级: 1 1 0 3 B 姓名:傅笔贵学号: 2009080305302 2014年7 月10 日
一.采用的数据结构说明 字符数组: 本程序中包含的字符数组有: filename1[20]:在Ccopy()函数中,存储源文件路径和名字的字符数组。 filename2[20]:在Ccopy()函数中,存储目标文件路径和名字的字符数组。 oldname[20]:在Cmv()函数中用来保存源文件路径和名字的字符数组。 newname[20]:在Cmv()函数中用来保存目标文件路径和名字的字符数组。 Cho2[6]:存取用户输入的指令,并用来作为Switch分支的判定条件之一。 File[20]:Cerase()函数中用来存放要删除的文件的路径和名字的字符数组。 Word[100]:在Cdis()中存放用户要回显的字符串。 二.源程序清单、注释和流程图 (1)流程图
(2)源程序和注释 #include
1. find find pathname -options [-print -exec -ok] 让我们来看看该命令的参数: pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print find命令将匹配的文件输出到标准输出。 -exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格, 注意一定有分号结尾。 0) -ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 find . -name "datafile" -ctime -1 -exec ls -l {} \; 找到文件名为datafile*, 同时创建实际为1天之内的文件, 然后显示他们的明细. find . -name "datafile" -ctime -1 -exec rm -f {} \; 找到文件名为datafile*, 同时创建实际 为1天之内的文件, 然后删除他们. find . -name "datafile" -ctime -1 -ok ls -l {} \; 这两个例子和上面的唯一区别就是-ok会在每个文件被执行命令时提示用户, 更加安全. find . -name "datafile" -ctime -1 -ok rm -f {} \; 1) find . -name 基于文件名查找,但是文件名的大小写敏感. find . -name "datafile*" 2) find . -iname 基于文件名查找,但是文件名的大小写不敏感. find . -iname "datafile*" 3) find . -maxdepth 2 -name fred 找出文件名为fred,其中find搜索的目录深度为2(距当前目录), 其中当前目录被视为第一层. 4) find . -perm 644 -maxdepth 3 -name "datafile*" (表示权限为644的, 搜索的目录深度为3, 名字为datafile*的文件) 5) find . -path "./rw" -prune -o -name "datafile*" 列出所有不在./rw及其子目录下文件名为datafile*的文件。 find . -path "./dir*" 列出所有符合dir*的目录及其目录的文件. find . \( -path "./d1" -o -path "./d2" \) -prune -o -name "datafile*" 列出所有不在./d1和d2及其子目录下文件名为datafile*的文件。 6) find . -user ydev 找出所有属主用户为ydev的文件。 find . ! -user ydev 找出所有属主用户不为ydev的文件,注意!和-user之间的空格。 7) find . -nouser 找出所有没有属主用户的文件,换句话就是,主用户可能已经被删除。 8) find . -group ydev 找出所有属主用户组为ydev的文件。
第六章dc_shell命令解释程序 第一节设计目标 6-1-1背景介绍 dc_shell 是Synopsys Design Compiler的shell(命令解释程序),与unix的shell 类似。Unix的C shell 和Bourne-shell作为命令解释程序,在用户和unix 核之间实现了功能极强的接口程序。相同地,Dc_shell最为Synopsys Design Compiler的功能极强的命令解释程序。象unix shell 提供程序设计语言在unix 文件系统中操作一样,dc_shell 提供script(脚本)语言在Design Compiler 的设计中操作,且仿造unix shell 的相同的结构。 用dc_shell 脚本综合设计有许多优点:首先,脚本执行速度比象design analyzer 交互式的界面快得多,脚本也用来证明综合设计的过程。更重要的是,脚本提供一个重复编译的机制,这不仅对设计的再利用重要,而且对于当要求一项函数改变时,再次产生设计文件的所要求的时间最小化也很重要。 所有的这些优点源于使用脚本自动走完综合流程。但是,dc_shell 脚本能够做的远不只这些,它能扩展Design Analyzer和Design Compiler的功能。一些Design compiler命令的顺序由脚本得出。大多数经验丰富的Synopsys的用户将脚本和Design analyzer结合使用来分析和优化设计。 6-1-2 目标程序类型的审阅 dc_shell脚本生成设计目标程序和编译属性来引导综合流程。当编写dc_shell脚本时,考虑正在运行的目标程序/信息的类型是很重要的。这一节从“Design Compiler Family Reference Manual”的章节中总结了“design compiler”的概念。 6-1-2-1 实例、网络、端口 原理图由三个基础的构件组成:实例、网点、端口。实例是代表逻辑子程序或层次的符号,网络是代表在实例之间有电气连续性的导线,端口是用来代表层次连续性的线路终结器。这些都是标准的术语。使设计者感到新颖的是reference 的概念。 6-1-2-2 单元、引用、设计 如果一实例代表一逻辑子程序,则它能代表什么类型的子程序呢?一实例能代表一库元件或一设计。用许多术语描述设计是必须的因为一设计可能包含同一库元件(或子设计)的多重实例。 举例说,一典型设计包含与非门,设计中的每一门实例都被赋予唯一的单元名用来在非唯一的实例中彼此区分。同样的,一设计可能包含多个加法器,与与非门不同,加法器一般来说不是库元件,加法器是一个可逐步分解成库元件和网络且相互连接后执行加法器功能的完全设计。与库元件相同,每一子设计的实例都被赋予唯一的单元名。 库元件是无形的设计子程序且在设计中常被做为节点单元引用。设计是逻辑块,它们可作为独立的设计或作为更大设计的子设计。作为其它设计中连接上下关系的子模块,设计中每一个唯一的实例被作为一个分层次的单元引用。在一个单独设计的上下关系中,每一个实例具有唯一的单元名,这些单元引用库元件或设计。设计者可以对每个单元单独地进行优化,也可以通过布置属性或约束(在以下定义)对每个库元件或设计进行优化。但是,属性被直接加至库元件或设计中,这可能影响包含引用这些库元件或设计的每一个设计。 图6.1 单元、引用、设计之间的关系 假设你想要影响一个单独设计中的每一个与非门的优化而没有影响其它设计中的与非门则将会如何呢?引用的概念使这成为可能,设计中的每一个单元不仅是库元件中或设计中唯一命名的实例,而且是引用库元件或设计的一系列单元中的一员。 参考以下图6.2的设计: 图6.2脉动计数器:count_16 这个分层次设计的顶层是一个16位的计数器,顶层设计由与非门、或非门、8位计数器组成。在这层次设计的关系