Linux程序设计-作业
作业一
task1
a)将当前目录下所有文件备份并压缩成 tar.gz,如果成功再将备份拷贝到 /backup 目录下。
1 | tar czf backup.tar.gz * |
b) 将上述备份压缩后的文件解压到原来的目录。
1 | tar xzf /backup/backup.tar.gz ./ |
c) 将当前目录下所有后缀为.html的文件的后缀改为.htm。
1 | rename .html .htm *.html |
d) 将当前目录下所有子目录下以a开头的.cpp文件改名为以b开头的.c文件。
1 | find . -type f -name "a*.cpp" -exec rename "s/^a(.*)\.cpp$/b\$1\.c/" {} \; |
task2
a) 请简要叙述DOS/Windows中的文本文件,UNIX/Linux中的文本文件以及Mac中的文本文件有何不同 之处,并给出至少一种你认为较为实用的转换方案。(需要两两给出转换方案)
- DOS/Windows 中的文本文件使用 \r\n 作为换行符,用 .txt 或 .doc 等扩展名表示。
- UNIX/Linux 中的文本文件使用 \n 作为换行符,用 .txt 或没有扩展名表示。
- Mac 中的文本文件使用 \r 作为换行符,用 .txt 或 .doc 等扩展名表示。
转换方案:
从DOS / Windows转换为UNIX / Linux
1
sed -i "s/\r$//" file.txt
从UNIX / Linux转换为DOS / Windows:
1
sed -i "s/$/\r/" file.txt
从Mac转换为UNIX / Linux:
1
cat file.txt | tr "\r" "\n" > newfile.txt
从UNIX / Linux转换为Mac:
1
cat file.txt | tr "\n" "\r" > newfile.txt
从DOS / Windows转换为Mac
1
cat file.txt | tr -d "\n" > newfile.txt
从Mac转换为DOS / Windows
1
cat file.txt | tr "\r" "\n" | sed 's/$/\r/' > newfile.txt
b) 请查阅 Linux 系统中/etc/fstab 文件各字段功能,并对你自己安装的 Linux 系统中/etc/fstab 的各个字段做出解释。
有以下字段:<file system> <mount point> <type> <options> <dump> <pass>
- <file system> :要挂载的文件系统的设备名或UUID等标识符,如/dev/sda1、UUID=xxxxxx等
- <mount point>:文件系统挂载到的目录,即文件系统挂载的目标目录
- <type>:文件系统的类型,例如ext4、ntfs等
- <options>:挂载选项,用于指定挂载时的各种选项,例如rw(读写)、ro(只读)、noexec(禁止执行程序)、nosuid(禁止SUID/SGID)等
- <dump>:备份标志,用于指定是否备份该文件系统,设置为0表示不备份
- <pass>:文件系统检查顺序,用于指定系统启动时按照什么顺序检查文件系统,设置为1表示在根文件系统之后检查,值为2则表示该文件系统将在所有值为1的文件系统之后检查
c) 用命令行实现: 从光盘制作一个.iso 文件,如果成功将光盘弹出。
1 | dd if=/dev/cdrom of=/path/to/image.iso && eject |
附加题:

1 | cd /tmp/gsl |
作业2
task1
用命令行打印 HOME、PATH、SHLVL、LOGNAME 变量的值:
1 | echo $HOME |
task2
请用中文解释 Shell 脚本程序,并说明运行结果:
*#!/bin/sh*
*clear*
*select item in Continue Finish*
*do*
*case “$item” in*
*Continue) ;;*
*Finish) break ;;*
**) echo “Wrong choice! Please select again!” ;;*
*esac*
*done*
该脚本提供一个简单的交互式菜单,让用户选择继续或结束程序。
具体地,先使用clear清除屏幕上的所有输出,然后用select显示一个包括Continue和Finish两个选项的菜单,用户选择Continue时会继续循环,选择Finish则会用break退出循环,选择其他的则会打印错误提示,然后继续循环要求重新选择。
task3
阅读下列 Makefile 并用中文说明其含义:
=========Makefile1=========
export Top:=$(shell pwd}
export Src:=$(Top)/src/
export Include:=$(Top)/include/
export Build:=$(Top)/build/
all:
@$(MAKE) -C $(Src)
install:
@cp $(Build)/test $(Top)
clean:
@-rm -rf $(Build) $(Top)/test
========= Makefile2=========
all:main.o test4.o
@mkdir -p $(Build)
@mv /.o $(Build) *
$(MAKE) -C $(Src)/dir1
$(MAKE) -C $(Src)/dir2
$(CC) -o $(Build)/test $(Build)/*.o $(Build)/dir1/*.o $(Build)/dir2/*.o
main.o : $(Include)/func.h
$(CC) -c main.c -I$(Include)
Makefile1首先声明了四个环境变量,分别为Top(指向当前目录),Src(指向Top目录下的src目录),Include(指向Top目录下的include目录)和Build(指向Top目录下的build目录)。
定义了make all指令为在src目录下执行make命令;定义了make install指令为将$(Build)/test中的文件复制到$(Top)下;定义了make clean指令为删除$(Build)/test和$(Top)/test中的所有文件。
Makefile2的功能是生成可执行文件。
指令make all依赖于main.o和test4.o两个目标(即需要先编译生成 main.o 和 test4.o 两个目标);它会先在$(Build)路径生成build目录,然后将所有后缀为.o的文件移动到build目录下;然后执行 $(Src)/dir1 和 $(Src)/dir2 目录中的 Makefile,从而编译这两个目录下的源文件并生成对应目标文件;然后用gcc编译器将$(Build) 、$(Src)/dir1、$(Src)/dir2 三个目录下的所有目标文件链接起来,并生成可执行文件保存到 $(Build)/test目录下。
定义了一个main.o的目标,其生成依赖于$(Include)下的func.h文件;生成方法是,使用gcc编译器编译main.c文件,并且指定了头文件在$(Include)中。