Linux程序设计-作业

作业一

task1

a)将当前目录下所有文件备份并压缩成 tar.gz,如果成功再将备份拷贝到 /backup 目录下。

1
2
tar czf backup.tar.gz *
cp backup.tar.gz /backup

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

附加题:

image-20241215213113214
1
2
cd /tmp/gsl
find . -name "makefile" -type f -print0 | xargs -0 -I{} cp {} /home/usrname/gsl/{}

作业2

task1

用命令行打印 HOME、PATH、SHLVL、LOGNAME 变量的值:

1
2
3
4
echo $HOME
echo $PATH
echo $SHLVL
echo $LOGNAME

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)中。

作业3

​ 地址:垃圾桶 / LinuxCommand · 极狐GitLab