DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"详解

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"详解

最近经常在bash脚本文件中看到类似于如下所示的语句:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "${DIR}/.."

刚开始真弄不明白这是什么含义,通过深入学习bash脚本知识,终于理解其含义,现将详细解释记录如下,以备今后不时之需。
${BASH_SOURCE[0]}表示bash脚本的第一个参数(如果第一个参数是bash,表明这是要执行bash脚本,这时"${BASH_SOURCE[0]}"自动转换为第二个参数),例如:

bash modules/tools/planning_traj_plot/run.sh 
modules/tools/planning_traj_plot/example_data/1_planning.pb.txt 
modules/tools/planning_traj_plot/example_data/1_localization.pb.tx

"${BASH_SOURCE[0]}"代表的是modules/tools/planning_traj_plot/run.sh
"dirname"表示提取参数里的目录,dirname "${BASH_SOURCE[0]}"表示提取bash脚本第一个参数里的目录,例如modules/tools/planning_traj_plot/run.sh”的目录为"modules/tools/planning_traj_plot
cd "$( dirname "${BASH_SOURCE[0]}" )"表示切换到刚才提取的目录,例如:对于上述示例中的的目录modules/tools/planning_traj_plotcd "$( dirname "${BASH_SOURCE[0]}" )"表示在当前目录的基础上,切换到子目录modules/tools/planning_traj_plot
DIR=cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd则表示,如果第一条语句顺利执行,就执行pwd显示当前目录,并将结果赋值给变量“DIR”。
cd "${DIR}/.."自不必说,就是切换到“DIR"变量所指目录的上一级目录。
下面是完整的示例:

1.run.sh文件内容(省略实际执行部分):
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo ${DIR}
cd "${DIR}/.."
2.在Shell终端执行如下命令(当前路径为:/home/davidhopper/code/apollo

bash modules/tools/planning_traj_plot/run.sh 
modules/tools/planning_traj_plot/example_data/1_planning.pb.txt 
modules/tools/planning_traj_plot/example_data/1_localization.pb.tx

结果如下:

/home/davidhopper/code/apollo/modules/tools/planning_traj_plot

运行结果

#!/bin/bash # Copyright (c) Huawei Technologies Co., Ltd. 2022-2024. All rights reserved. set -e PRODUCT_NAME="$1" BIN_TYPE="$2" HAS_CIPHER="$3" CHIP_NAME="$4" LOG_INFO="$5" LOG_ERR="$6" init_chip() { echo -e "${LOG_INFO}[product]${PRODUCT_NAME} [type]${BIN_TYPE} [cipher]${HAS_CIPHER}" CUR_DIR="$(cd $(dirname $0);pwd)" ROOT_DIR="${CUR_DIR}/.." CHIP_PROJECT_DIR="${ROOT_DIR}/../../../build/smartdevice/${CHIP_NAME}/project" TARGET_STA_LIB_DIR="${CHIP_PROJECT_DIR}/sdk/target/libs/sdk_libs/sta" TARGET_CCO_LIB_DIR="${TARGET_STA_LIB_DIR}/../cco" PRODUCT_DIR="${ROOT_DIR}/source" PRODUCT_ADAPTER="${PRODUCT_DIR}/adapter" TARGET_STA_PRODUCT_DIR="${CHIP_PROJECT_DIR}/sdk/app/module_app/src/device" VERSION_CFG_DIR="${CUR_DIR}/../../../../product/common/version_config" TARGET_VERSION_CFG_DIR="${CHIP_PROJECT_DIR}/sdk/app/module_app/src/version_config" TARGET_STA_BUILD_DIR="${CHIP_PROJECT_DIR}/sdk/build" if [ "${HAS_CIPHER}" == "cipher" ] && [ "${PRODUCT_NAME}" == "ai_sensor" ] && \ [ "${BIN_TYPE}" == "debug" -o "${BIN_TYPE}" == "release" ]; then PLC_SDK_LIB_DIR="${ROOT_DIR}/platform/${CHIP_NAME}/plc_sdk_cipher/lib" elif [ "${PRODUCT_NAME}" == "switch_panel" ]; then PLC_SDK_LIB_DIR="${ROOT_DIR}/platform/${CHIP_NAME}/plc_sdk/lib_switch" else PLC_SDK_LIB_DIR="${ROOT_DIR}/platform/${CHIP_NAME}/plc_sdk/lib" fi echo -e "${LOG_INFO}${PLC_SDK_LIB_DIR}" } replace_cipher_adapter() { echo -e "${LOG_INFO} start to replace cipher adapter" cp -rf ${PRODUCT_ADAPTER}/plc_sdk_cipher/diff ${TARGET_STA_PRODUCT_DIR}/adapter/plc_sdk ls ${TARGET_STA_PRODUCT_DIR}/adapter/plc_sdk echo -e "${LOG_INFO}replace cipher plc sdk adapter success" } build_chip() { rm -f ${TARGET_STA_LIB_DIR}/libsta* #copy to project if [[ "${PRODUCT_NAME}" == "switch_panel" ]]; then cp ${PLC_SDK_LIB_DIR}/libstaapp_release.a ${TARGET_STA_LIB_DIR}/libstaapp.a cp ${PLC_SDK_LIB_DIR}/libstaapp_release.a ${TARGET_CCO_LIB_DIR}/libstaapp.a else if [[ "${BIN_TYPE}" == "debug" ]]; then if [ "${HAS_CIPHER}" == "cipher" ] && [ "${PRODUCT_NAME}" == "ai_sensor" ] && \ [ "${BIN_TYPE}" == "debug" -o "${BIN_TYPE}" == "release" ]; then cp ${PLC_SDK_LIB_DIR}/libstacmd_release.a ${TARGET_STA_LIB_DIR}/libstacmd.a cp ${PLC_SDK_LIB_DIR}/libstacmd_release.a ${TARGET_CCO_LIB_DIR}/libstacmd.a else # use plc sdk realease version cp ${PLC_SDK_LIB_DIR}/libstacmd_release.a ${TARGET_STA_LIB_DIR}/libstacmd.a cp ${PLC_SDK_LIB_DIR}/libstacmd_release.a ${TARGET_CCO_LIB_DIR}/libstacmd.a fi else cp ${PLC_SDK_LIB_DIR}/libstacmd_release.a ${TARGET_STA_LIB_DIR}/libstacmd.a cp ${PLC_SDK_LIB_DIR}/libstacmd_release.a ${TARGET_CCO_LIB_DIR}/libstacmd.a fi fi if [ -d "${TARGET_STA_PRODUCT_DIR}" ]; then rm -rf ${TARGET_STA_PRODUCT_DIR} fi # cp whole source cp -r ${PRODUCT_DIR} ${TARGET_STA_PRODUCT_DIR} if [ -d "${TARGET_VERSION_CFG_DIR}" ]; then rm -rf ${TARGET_VERSION_CFG_DIR} fi cp -r ${VERSION_CFG_DIR} ${TARGET_VERSION_CFG_DIR} cp -r ${ROOT_DIR}/configs/common/bin_type/${BIN_TYPE}/plc_bin_type.h ${CHIP_PROJECT_DIR}/sdk/app/module_app/src cp -r ${ROOT_DIR}/../app/product/panel/common/annoy_utils/src/panel_annoy.c ${CHIP_PROJECT_DIR}/sdk/app/module_app/src cp -r ${ROOT_DIR}/../app/product/panel/common/annoy_utils/include/panel_annoy.h ${CHIP_PROJECT_DIR}/sdk/app/module_app/src source ${CUR_DIR}/build_plc_nv_patch_diag.sh echo -e "${LOG_INFO}copy plc lib to ${CHIP_NAME} project done" # config chiper if [ "${HAS_CIPHER}" == "cipher" ] && [ "${PRODUCT_NAME}" == "ai_sensor" ] && \ [ "${BIN_TYPE}" == "debug" -o "${BIN_TYPE}" == "release" ]; then replace_cipher_adapter source ${CUR_DIR}/build_cipher.sh ${CHIP_NAME} fi # build project cd ${TARGET_STA_BUILD_DIR} python3 build.py -t=sta -p=module_app source ${CUR_DIR}/move_output_project.sh ${ROOT_DIR} ${CHIP_NAME} ${BIN_TYPE} \ ${CHIP_PROJECT_DIR} ${PRODUCT_NAME} ${LOG_INFO} ${LOG_ERR} } init_chip build_chip set +e,这个是build_plc_chip.sh代码,继续分析
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值