首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同一目录下的另一个bash脚本中使用函数和变量?

问如何在同一目录下的另一个bash脚本中使用函数和变量?
EN

Stack Overflow用户
提问于 2017-10-27 23:21:50
回答 3查看 106关注 0票数 1

所以我试着在bash中做一个倒计时器,我有两个文件-

一个用于我的报警功能

另一个用于在终端上显示数字

所以我的目录结构有点像这样-

父目录

|____ alarm.sh

|____ views.sh

我的第一个尝试是创建一个$directory变量并获取路径-

代码语言:javascript
复制
directory=$PWD

但是,如果我从另一个目录执行脚本,就会产生问题,因为$directory将是新目录,而不是脚本所在的目录。

然后我尝试使用readlink命令-

代码语言:javascript
复制
path=$(dirname "$(readlink -f "$0")")
. $path/views.sh

然而,这会带来问题。虽然它在GNU/Linux bash中确实可以工作,但在OSX bash (我认为它是BSD,但我可能错了)中它不起作用。

所以我的基本问题是-如何从alarm.sh引用views.sh?有没有一种方法可以做到这一点,而不需要费力地查找父目录名称?

EN

回答 3

Stack Overflow用户

发布于 2017-10-28 00:46:12

解决此问题的最简单方法可能是将alarm.sh的目录添加到view.sh中的路径中

代码语言:javascript
复制
PATH=$PATH:/path/to/alarm
source alarm.sh ...

如果您有许多脚本需要这种引用,或者如果您有许多目录需要添加到PATH中,那么谨慎的做法是编写一个init脚本来适当地设置PATH (以及所需的其他环境变量)。然后,您可以在所有脚本中调用init脚本:

代码语言:javascript
复制
source /path/to/init.sh # set PATH etc
source alarm.sh

对于派生alarm.sh相对于view.sh目录的路径的直接需求(请参见此post),您可以这样做:

代码语言:javascript
复制
this_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
cd "$this_dir"
source alarm.sh # (or source ./path/to/alarm.sh or source ../path/to/alarm.sh)

请记住,一个好的脚本永远不应该对它所在的目录或调用程序的当前目录做任何假设。

票数 0
EN

Stack Overflow用户

发布于 2017-10-28 00:52:00

对于《财富》杂志来说,这个问题很容易解决。

如果这两个文件位于同一目录中,则可以在不获取文件完整路径的情况下导入。

示例:

然后,如果您想在alarm.sh中使用在views.sh中定义的函数和变量,您可以像这样“导入”:

代码语言:javascript
复制
#views.sh
TIME=60

# alarm.sh
source views.sh


echo "this is a views.sh variable: $TIME"

其他解决方案,如果脚本位于不同的文件夹中,您可以这样做:

代码语言:javascript
复制
#views.sh
TIME=60

# alarm.sh
source $(readlink -f views.sh)


echo "this is a views.sh variable: $TIME"

readlink命令给出了不带符号链接的文件的完整路径。这在OSX上不会给你带来问题。

我不建议您使用此表单:

代码语言:javascript
复制
path=$(dirname "$(readlink -f "$0")"

例如目录名称:目录名称:为您提供了不转换符号链接的文件路径readlink -f:为您提供了包含符号链接转换的完整路径。

我有这些文件:

代码语言:javascript
复制
├── files -> folder/folder2

├── folder

│   └── folder2

│       └── file_001.txt

如你所见,"files“是一个符号链接。然后,如果我使用dirname:

文件user@host:/$目录home/user/files/_001.txt

主页/用户/文件

但是如果我使用readlink:

文件读取链接-f主目录/用户/文件/ user@host:/$ _001.txt

/home/user/folder/folder2/file_001.txt

票数 0
EN

Stack Overflow用户

发布于 2017-10-29 02:31:45

您可以尝试这样做,但views.sh必须是唯一的。我认为这和readlink是一样的

代码语言:javascript
复制
# alarm.sh
viewer="$(find ../ -name views.sh)"
source "$viewer"
echo "this is a views.sh variable: $TIME"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46978467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档