所以我试着在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?有没有一种方法可以做到这一点,而不需要费力地查找父目录名称?
发布于 2017-10-28 00:46:12
解决此问题的最简单方法可能是将alarm.sh的目录添加到view.sh中的路径中
PATH=$PATH:/path/to/alarm
source alarm.sh ...如果您有许多脚本需要这种引用,或者如果您有许多目录需要添加到PATH中,那么谨慎的做法是编写一个init脚本来适当地设置PATH (以及所需的其他环境变量)。然后,您可以在所有脚本中调用init脚本:
source /path/to/init.sh # set PATH etc
source alarm.sh对于派生alarm.sh相对于view.sh目录的路径的直接需求(请参见此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)请记住,一个好的脚本永远不应该对它所在的目录或调用程序的当前目录做任何假设。
发布于 2017-10-28 00:52:00
对于《财富》杂志来说,这个问题很容易解决。
如果这两个文件位于同一目录中,则可以在不获取文件完整路径的情况下导入。
示例:
然后,如果您想在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")"例如目录名称:目录名称:为您提供了不转换符号链接的文件路径readlink -f:为您提供了包含符号链接转换的完整路径。
我有这些文件:
├── 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
发布于 2017-10-29 02:31:45
您可以尝试这样做,但views.sh必须是唯一的。我认为这和readlink是一样的
# alarm.sh
viewer="$(find ../ -name views.sh)"
source "$viewer"
echo "this is a views.sh variable: $TIME"https://stackoverflow.com/questions/46978467
复制相似问题