在bash脚本中,我尝试使用$(dirname "$BASH_SOURCE")
获取另一个位于另一个目录中的bash脚本。 $(dirname "$BASH_SOURCE")
目前/Users/dank/code/<PROJECT>/utils/jwt
的位置。
.
|__ utils
|__ jwt
| |__ rand.sh
| |__ get_jwt.sh # this sources id/create_new_user.sh
|
|__ id
|__ create_new_user.sh
从项目根目录.
(cd /Users/dank/code/<PROJECT>
),我正在运行./utils/jwt/get_jwt.sh
(相当于/Users/dank/code/<PROJECT>/utils/jwt/get_jwt.sh
)。由于./utils/id/create_new_user.sh
为/Users/dank/code/<PROJECT>/utils/jwt/../id/get_jwt.sh
,此bash脚本会在$(dirname "$BASH_SOURCE")
(相当于/Users/dank/code/<PROJECT>/utils/jwt
)内来源并调用一个函数。
但是我看到一种奇怪的行为,如果我不从rand.sh
(来自同一目录),我无法从id/create_new_user.sh
(来自另一个目录)获取:
source $(dirname "$BASH_SOURCE")/rand.sh # Why do I have to have this LOC?
source $(dirname "$BASH_SOURCE")/../id/create_new_user.sh # Does not work without above LOC
如果删除source $(dirname "$BASH_SOURCE")/rand.sh
,我会收到错误:
./utils/jwt/../id/create_new_user.sh: line 9: ./utils/jwt/create_new_user.sh: No such file or directory
为什么我必须来源rand.sh
?为什么我不能只提供我需要的脚本?
答案 0 :(得分:1)
我看不出你为什么需要rand.sh。
我只是尝试使用以下代码复制您的情况:
utils/jwt/get_jwt.sh
#!/bin/bash
echo 'Get jwt'
source $(dirname "$BASH_SOURCE")/../id/create_new_user.sh
echo 'All done'
utils/id/create_new_user.sh
#!/bin/bash
echo 'create new user'
使用./utils/jwt/get_jwt.sh
运行此操作会创建预期的输出:
Get jwt
create new user
All done
以所描述的方式获取文件是有效的,您的问题必须是您脚本中的其他内容。