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

标签 linux bash shell

所以我想在 bash 中制作一个倒数计时器,我有两个文件-
一个用于我的闹钟功能
另一个用于在终端上显示数字

所以我的目录结构有点像这样-
父目录
|____ 闹钟.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 目录添加到 view.sh 中的 PATH:

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

如果您有很多脚本需要这种引用,或者如果您有很多目录需要添加到 PATH 中,那么谨慎的做法是编写一个初始化脚本来设置 PATH(以及其他需要的环境变量) )适当。然后,您可以在所有脚本中调用 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)

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

关于linux - 如何在同一目录中的另一个脚本中使用 bash 脚本中的函数和变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978467/

相关文章:

ruby - SoundCLI gem 失败

xml - 使用 sed 在 xml 中复制一行并保持相同的缩进

linux - 为什么 OS X 10 中的默认 shell 与 Linux(Mint、Lubuntu...)中的默认 shell 看起来不同?

shell - `USER` 和 `USERNAME` 环境变量有什么区别?

linux - 无法修改cloudera Hadoop 4.7发行版中的配置文件

linux - 设备 MANJARO 上没有剩余空间

windows - 如何确定进程是否处于死锁状态或正在等待 I/O

python - Bash 完成脚本的单元测试

java - 在 jar 文件中执行 shell 脚本。如何提取?

linux - 操作不同的文件并将它们的最大值打印到新文件