繁体   English   中英

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

[英]How to use a function and variables from a bash script in another one in the same directory?

因此,我尝试在bash中建立一个倒数计时器,其中有两个文件-
我的闹钟功能之一
另一个用于在终端上显示数字

所以我的目录结构有点像这样-
父目录
| ____ alarm.sh
| ____ views.sh

我的第一次尝试是制作一个$ directory变量并获取路径-

directory=$PWD

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

然后,我尝试使用readlink命令-

path=$(dirname "$(readlink -f "$0")")
. $path/views.sh

然而,这产生了问题。 虽然它在GNU / Linux bash中确实有效,但在链接和所有链接下均有效,但在OSX bash中却没有(我认为它是BSD,但我可能错了)。

所以我的基本问题是-如何从alarm.sh引用views.sh? 有没有一种方法可以解决查找父目录名称的麻烦?

可能是解决这将是的目录添加的最简单方法alarm.sh到PATH中view.sh

PATH=$PATH:/path/to/alarm
source alarm.sh ...

如果您有许多需要这种引用的脚本,或者有许多目录需要添加到PATH,则最好编写一个初始化脚本来适当地设置PATH(以及所需的其他环境变量)。 然后,您可以在所有脚本中调用初始化脚本:

source /path/to/init.sh # set PATH etc
source alarm.sh

对于您获得的即时需求alarm.sh的相对路径的目录view.sh (看到这个帖子 ),你可以这样做:

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)

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

为了发财,这个问题很容易解决。

如果两个文件位于同一目录中,则可以导入而无需获取文件的完整路径。

例:

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

#views.sh
TIME=60

# alarm.sh
source views.sh


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

其他解决方案,如果脚本位于不同的文件夹中,则可以执行以下操作:

#views.sh
TIME=60

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


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

readlink命令为您提供不带符号链接的文件的完整路径。 这不必给您在OSX上的问题。

我不建议您使用以下形式:

path=$(dirname "$(readlink -f "$0")"

dirname的示例: dirname:为您提供不翻译符号链接的文件路由readlink -f:为您提供符号链接翻译的完整路径。

我有这个文件:

 ├── files -> folder/folder2 ├── folder │   └── folder2 │   └── file_001.txt 

如您所见,“文件”是一个符号链接。 然后,如果我执行dirname:

user @ host:/ $目录名home / user / files / file_001.txt

主页/用户/文件

但是,如果我使用readlink:

user @ host:/ $ readlink -f home / user / files / file_001.txt

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

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

# alarm.sh
viewer="$(find ../ -name views.sh)"
source "$viewer"
echo "this is a views.sh variable: $TIME"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM