gpt4 book ai didi

Linux shell命令读取文本文件并打开其中列出的文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:24 25 4
gpt4 key购买 nike

我写了一个 shell 脚本 (bin/bash)。该脚本会查看位于当前文件夹中的文件夹 startup、source 和 objects。然后它生成名为 startup_list(包括扩展名为 .s 的文件)、sources_list(扩展名为 .c 的文件)和 objects_list 的列表(文本文件) (包括扩展名为 .o 的文件)。我们将所有 .s 文件分配给变量 ASFILE,将所有 .c 文件分配给 GCCFILE,将所有 .o 文件分配给 LDFILE。

ASDIR="$(pwd)/startup"
GCCDIR="$(pwd)/source"
LDDIR="$(pwd)/objects"
INCDIR="$(pwd)/include"

ls $ASDIR/*.s > startup_list
sed -i 's|..*/||g' startup_list
ASFILE=$(cat startup_list)

ls $GCCDIR/*.c > sources_list
sed -i 's|..*/||g' sources_list
GCCFILE=$(cat sources_list)

cat startup_list sources_list > objects_list
sed -e 's/\.c/\.o/g' objects_list > objects_list_tmp
sed -e 's/\.s/\.o/g' objects_list_tmp > objects_list
LDFILE=$(cat objects_list)

这个脚本稍后会被集成到一个ma​​kefile中,但我现在需要一个shell命令来一个接一个地打开.c文件并检查#include命令后面列出的依赖项。还有一件事。文本文档 startup_list、sources_list 和 object_list 每行列出一个文件。它看起来像这样:

ea3131_startup_entry.c
pad.c
ea3131_board.c
lpc313x_cgu_default.c
lpc313x_cgu_driver.c
lpc313x_dma_driver.c
lpc313x_evt_driver.c

如果我省略命令

sed -i 's|..*/||g' sources_list 
sed -i 's|..*/||g' startup_list

我还可以获得前面文件的绝对路径,所以文本文件看起来像这样:

/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/startup/ea3131_startup_entry.c
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/startup/pad.c
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/source/ea3131_board.c
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/source/lpc313x_cgu_default.c
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/source/lpc313x_cgu_driver.c

那么我的选择是什么?我如何打开这些 .c 文件并检查我需要检查的内容?

问候齐加


这是我根据您的建议编写的完整 makefile。它还没有完成。我仍然需要添加编译 *.c 文件的行。

#!/bin/bash
# najprej nastavimo shell, ki je v nasem primeru bash

# nastavitev asemblerja, compilerja in linkerja
AS="arm-none-eabi-as"
GCC="arm-none-eabi-gcc"
LD="arm-none-eabi-ld"

# nastavitev nastavitev za asembler, compiler in linker
ASOPT="-mcpu=arm926ej-s -c -Wall"
GCCOPT="-mcpu=arm926ej-s -c -Wall"
LDOPT="-Tldscript_iram_gnu.ld"

# nastavitev direktorij v katerih se nahajajo kljucne datoteke za sestavo programa
ASDIR="$(pwd)/startup"
GCCDIR="$(pwd)/source"
LDDIR="$(pwd)/objects"
INCDIR="$(pwd)/include"

# potrebno je locirati vse startup, source in objektne datoteke. Ker objektnih datotek še ni, jih je potrebno sproti narediti in jih vse premakniti v mapo objects
ls $ASDIR/*.s > startup_list
sed -i 's|..*/||g' startup_list
ASFILE=$(cat startup_list)

ls $GCCDIR/*.c > sources_list
sed -i 's|..*/||g' sources_list
GCCFILE=$(cat sources_list)

cat startup_list sources_list > objects_list
sed -e 's/\.c/\.o/g' objects_list > objects_list_tmp
sed -e 's/\.s/\.o/g' objects_list_tmp > objects_list
LDFILE=$(cat objects_list)

all: executable

executable: $(LDFILE)
$(GCC) -M $(LDFILE)

clean:
rm startup_list sources_list objects_list objects_list_tmp
echo Pocistili ste vse datoteke.

出于某种原因,当我运行“make”或“make clean”命令时出现错误:

makefile:21: *** missing separator.  Stop.

我不确定我做错了什么,但我想我不太明白如何在 makefile 中正确使用 bash 命令,尤其是变量。有时我将它们用作 $(BOO) 有时用作 $BOO。第一个在 makefile 中工作但在命令行界面中失败,而第二个工作相反。我怎样才能解决这个问题?

最佳答案

你知道 gcc-M 标志吗? (有几个选项都以 -M 开头,您可以在其中定义在何处编写哪些依赖项 - 此调用独立于以后的编译,不会生成代码/目标文件,只是解析 deps)

关于Linux shell命令读取文本文件并打开其中列出的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5551979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com