gpt4 book ai didi

oracle - 在 makefile 中设置动态 ORACLE_HOME

转载 作者:行者123 更新时间:2023-12-03 21:11:15 25 4
gpt4 key购买 nike

所以我的组织正在将我们的 Oracle 数据库从 11g 升级到 19c。
以前,在我的 makefile 中,我一直这样设置 ORACLE_HOME:

ORACLE_HOME=/opt/app/oracle/product/11.2.0.4/db_1
然而,Oracle 19c 有一个有趣的特性,每当他们在其上运行补丁时,db_1 都会发生增量变化,变成 db_2,然后是 db_3,每个补丁等等。
所以显然我不能再硬编码 ORACLE_HOME 路径了。
在我的一堆脚本中,我从 ortab 文件中提取当前值,如下所示:
setenv ORACLE_SID DATABASE1
setenv ORACLE_HOME `cat /var/opt/oracle/oratab | sed 's/#.*//g' | grep -w $ORACLE_SID | awk -F: '{print $2;}'`
这工作得很好,从 ortab 文件中提取正确的 ORACLE_HOME 路径。
但是,当我尝试在 makefile 中执行此操作时,如下所示:
ORACLE_SID=DATABASE1
ORACLE_HOME=`cat /var/opt/oracle/oratab | sed 's/#.*//g' | grep -w $ORACLE_SID | awk -F: '{print $2;}'`
当我尝试运行 make 时出现此错误:
 $ make
`cat /var/opt/oracle/oratab | sed 's//bin/proc sys_include=/usr/include lines=yes iname=file1.pc oname=file1.c include=/path/to/include
First RE may not be null
*** Error code 2
make: Fatal error: Command failed for target `file1.o'
很明显,该命令没有按照我期望的方式工作,但我不确定如何修复它。
如何修复命令以在 makefile 中工作?我正在运行 Solaris 11。
这不是 GNU make,这只是 Solaris 11 附带的默认 make。
添加更多信息:
我的 ortab 文件如下所示:
$cat /var/opt/oracle/oratab
DATABASE_TEST:/opt/app/oracle/product/11.2.0.4/db_7:Y
DATABASE1:/opt/app/oracle/product/19.0.0.0/db_3:N
DATABASE2:/opt/app/oracle/product/11.2.0.4/db_13:Y
DATABASE3:/opt/app/oracle/product/11.2.0.4/db_1:Y
DATABASE_PROD:/opt/app/oracle/product/11.2.0.4/db_2:Y
所以,我需要做的是,使用DATABASE1的ORACLE_SID,拉出 /opt/app/oracle/product/19.0.0.0/db_3部分,用作我在 makefile 中的 ORACLE_HOME 目录。
更新:
根据下面来自 MadScientist 的回答,这现在是我的 makefile:
ORACLE_SID=DATABASE1
#ORACLE_HOME = /opt/app/oracle/product/19.0.0/db_3
ORACLE_HOME = `cat /var/opt/oracle/oratab | sed 's/\#.*//g' | grep -w ${ORACLE_SID} | awk -F: '{print $$2;}'`

PROC=${ORACLE_HOME}/bin/proc

E_INCLUDE=/path/to/include

print-% : ; @echo $* = $($*)

file1.o: file1.pc
${PROC} sys_include=/usr/include lines=yes iname=$*.pc oname=$*.c include=${E_INCLUDE}
当我硬编码 ORACLE_HOME 时,一切正常。
当我尝试使用动态创建的 ORACLE_HOME 时,出现此错误:
$ make
`cat /var/opt/oracle/oratab | sed 's/\#.*//g' | grep -w DATABASE1 | awk -F: '{print $2;}'`/bin/proc sys_include=/usr/include lines=yes iname=file1.pc oname=file1.c include=/path/to/include
make: Fatal error: Command failed for target `file1.o'
所以看起来它将 ORACLE_HOME 设置为命令本身,而不是命令的结果。
奇怪的是,当我运行 make print-ORACLE_HOME 时,我得到了预期的结果 /opt/app/oracle/product/19.0.0/db_3

最佳答案

嗯,当然是这样:

setenv ORACLE_HOME /opt/app/oracle/product/11.2.0.4/db_1
之前不可能出现在您的 makefile 中,因为这不是有效的 makefile 语法。此外,令我惊讶的是,在 2020 年,有人仍在使用 csh 进行任何操作,尤其是脚本编写。但无论如何。
您遇到的问题是 makefile 不是 shell 脚本,并且语法规则不同。当然,makefile 在其中包含 shell 脚本,但仅限于配方:这里您设置的是一个 makefile 变量。因此,仅仅将 shell 语句放入变量赋值中可能无法正常工作。
这里有三个问题:首先,makefile 中的变量引用格式为 $(FOO)${FOO}但不是 $FOO .二、一个 #被认为是 makefile 中的注释字符,必须进行转义。最后,如果您确实想要一个实际的 $不是变量引用,你必须转义它,如: $$ .修复这些,这应该可以工作,但请注意,可能有更简单的方法来做到这一点:
ORACLE_SID = DATABASE1
ORACLE_HOME = `cat /var/opt/oracle/oratab | sed 's/\#.*//g' | grep -w $(ORACLE_SID) | awk -F: '{print $$2;}'`
你说在这之后,这个规则:
PROC=${ORACLE_HOME}/bin/proc

file1.o: file1.pc
${PROC} sys_include=/usr/include lines=yes iname=$*.pc oname=$*.c include=${E_INCLUDE}
给出这个输出:
$ make
`cat /var/opt/oracle/oratab | sed 's/\#.*//g' | grep -w DATABASE1 | awk -F: '{print $2;}'`/bin/proc sys_include=/usr/include lines=yes iname=file1.pc oname=file1.c include=/path/to/include
make: Fatal error: Command failed for target `file1.o'
该错误消息不是很有帮助,也没有任何意义。很遗憾,这并没有给出更好的信息。
我建议您将规则更改为:
file1.o: file1.pc
echo PROC=\'${PROC}\'; ${PROC} sys_include=/usr/include lines=yes iname=$*.pc oname=$*.c include=${E_INCLUDE}
然后,您应该在输出中看到类似的内容:
$ make
echo PROC=\'`cat /var/opt/oracle/oratab...lots of stuff...
PROC='/...'
make: Fatal error: Command failed for target `file1.o'
你想看的是输出的第二行, PROC='/...'并检查该路径 /... ,无论它是什么,以确保它看起来正确。此外,它不应包含任何空格或其他特殊字符等。
如果打印的值看起来有误,则必须修复脚本以使其正确。如果它看起来正确,那么我不知道发生了什么,它必须与您使用的 make 版本有关。

关于oracle - 在 makefile 中设置动态 ORACLE_HOME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63745630/

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