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