【发布时间】:2018-07-07 12:46:54
【问题描述】:
我有几个包含文件 stamp1.txt 和 stamp0.txt 的目录,我想要覆盖 cat 命令。例如,我需要它来禁止将“stamp1”文件归档到库中。
所以我编写了一个名为“realname”的小过滤程序和 bash 脚本来覆盖原来的 cat 命令。
function cat() {
local e=""
for s in $@
do
if realname $s; then
e=$e" "$s;
fi
done
command cat $e;
}
所以命令:
cat dir1/stamp1.txt dir2/stamp0.txt
将转换为
cat dir2/stamp0.txt
这个例子很好用
ar cruv some_lib.a `cat dir1/stamp1.txt dir2/stamp0.txt`
但是当我运行一些 makefile 来构建一些软件时 - 在这个过程中使用原始 cat 也没有被覆盖。
如何在不更改 makefile 的情况下覆盖 cat 或任何其他命令以使其在 make 过程中工作(makefile 是 3rdparty 软件,我不希望每次需要升级时都对其进行修补) ?
【问题讨论】:
-
移动或重命名
stamp1.txt不是更容易吗? -
在我看来,步骤(1)确保使用宏
CAT = cat并在命令行中引用它(所以ar cruv some_lib.acat dir1/stamp1.txt dir2/stamp0.txt`变成${AR} ${ARFLAGS} ${LIBNAME} `${CAT} ${STAMP1} ${STAMP2}`) 和 (2) 在 Make 命令行上调整STAMP1=或CAT=your-shell-script(脚本,不是函数!)。如果一切都是宏,您可以根据需要调整结果——在非常广泛的范围内。如果硬连线命令名称或选项标志,则会失去一些灵活性。不管眼前的问题如何,广泛使用宏是个好主意。 -
其他人的 makefile 存在问题——它们并不总是用最大的宏编写。如果他们忽略了该建议(他们可能会这样做),那么请考虑
sed 's/cat dir1/mycat dir1/' makefile > makefile.new; make -f makefile.new; rm -f makefile.new的优点,您可以在其中即时编辑生成文件。您可能需要比我在sed命令中概述的更敏感的搜索条件。
标签: bash makefile overriding cat unix-ar