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

时间:2017-10-27 15:21:50

标签: linux bash shell

所以我试图在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?有没有办法在没有找到父目录名的麻烦的情况下这样做?

3 个答案:

答案 0 :(得分:0)

解决这个问题的最简单方法是在alarm.sh中将view.sh目录添加到PATH:

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

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

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

为了您立即要求相对于alarm.sh的目录派生view.sh的PATH(请参阅此post),您可以这样做:

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)

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

答案 1 :(得分:0)

幸运的是,这个问题很容易解决。

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

示例:

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

<input type="file">
<audio controls></audio>
<script>
var input = document.querySelector("input[type=file]");
var audio = document.querySelector("audio");
input.onchange = function() {
  audio.src = URL.createObjectURL(input.files[0]);
}
</script>

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

#views.sh
TIME=60

# alarm.sh
source views.sh


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

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

我不建议您使用此表单:

#views.sh
TIME=60

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


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

dirname示例: dirname:为您提供指向文件的路径,而无需翻译符号链接 readlink -f:为您提供了符号链接翻译的完整路径。

我有这些文件:

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

正如您所见,“文件”是一个符号链接。如果我做dirname:

user @ host:/ $ dirname home / user / files / file_001.txt

家/用户/文件

但如果我使用readlink:

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

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

答案 2 :(得分:0)

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

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