系统相关
首页 > 系统相关> > linux – 使用来自另一个目录的相对路径运行脚本

linux – 使用来自另一个目录的相对路径运行脚本

作者:互联网

我正在编写一个脚本来编译代码.这些来源位于许多不同的目录中.我将发布源代码,我希望它可以被许多其他人编译.因此在我的脚本中我使用相对路径.
如果有人在他的机器上运行脚本,那么从脚本所在的目录开始,就像./script一切正常.但是,如果脚本是从另一个目录运行的,例如./path/to/script,则路径不正确,脚本不起作用.
我怎么能克服这个?

解决方法:

一个简单的起点可能是将其添加到脚本的顶部:

#!/bin/bash
scriptdir="$(dirname "$0")"
cd "$scriptdir"

以下所有代码都将在脚本目录中运行.

请注意,这是关于导致脚本运行

>从脚本所在的文件夹,和
>无论从最初调用脚本的位置如何

这是我怀疑你想要的,因为它是一个用于编译的脚本,因此它将被放置在src树中的一个非常特定的文件夹中(例如配置脚本或makefile的形式)

合理

> $0是正在运行的脚本的完整路径.

>来自bash man(我添加的格式):

Special Parameters

The shell treats several parameters specially. These parameters may
only be referenced; assignment to them is not allowed.

   ….

0   Expands to the name of the shell or shell script. This is set at
shell initialization.
   If bash is invoked with a file of commands,
$0 is set to the name of that file.

   If bash is started with the -c option, then $0 is set
to the first argument after
   the string to be executed, if one is
present. Otherwise, it is set to the file name
   used to invoke bash,
as given by argument zero.

> dirname返回其参数的路径
> cd更改当前目录

因此,在顶部使用此代码的每个脚本都将运行,就像当前在该目录中键入./script一样.

从另一个角度来看它

对于质量控制和冗余错误检查的度量,您可能希望实现一个包装函数,该函数检查特定文件夹结构或某些文件的存在,以指示一切正确. (无论出于什么原因,dirname和cd命令都不起作用 – 我在这篇帖子的底部有一个Mac示例).这个概念有两个方面:

>你正在做的事情来设置当前目录
>你正在检查你所做的事情是否有效.

例如:

runcheck () {
versioncheck () {

head -n1 version | grep -q "### myapp V"

}

backout () {
echo "Problem verifying source paths.  Are you sure your archive is complete?"
exit
}

[ -d ./src ] && [ -d ./docs ] && [ -d ../myapp ] && (versioncheck) || backout 
    return
}

该代码将检查以下内容:

>目录src与可执行脚本存在于同一路径中
>目录文档与可执行脚本存在于同一路径中
> myapp目录存在于从可执行脚本向下一级的路径中
>在与可执行脚本相同的路径中有一个名为version的文件,并且它的第一行包含字符串### myapp V(例如,对于可能有一行顶行的版本文件:### myapp V1.4 ###)

然后,您可以将命令runcheck放在脚本中的任何位置,以确保您位于正确的位置:

完整的实施示例:

#!/bin/bash

scriptdir="$(dirname "$0")"
cd "$scriptdir"

runcheck () {
versioncheck () {
    head -n1 version | grep -q "### myapp V"
}   

backout () {
    echo "Problem verifying source paths.  Are you sure your archive is complete?"
    exit
}

[ -d ./src ] && [ -d ./docs ] && [ -d ../myapp ] && (versioncheck) || backout 
    return
}

runcheck #initial check at start of script

## bunch of code
## goes here

runcheck #just checking again

## bunch of code
## goes here

runcheck #final check before really doing something bad

## end of script

侧注/补充:当没有彻底检查以解释脚本文件的符号链接等时,这将适用于bash ..(再次……在便携式源代码tarball等中,我非常怀疑是这种情况) .

我建议阅读这个帖子:Getting the source directory of a Bash script from within
 如果您想要或者需要对此主题有透彻的了解,以便更全面地应用它.

我再次使用你所知道的为你所需要的东西重新使用 – 例如,使用dirname“$(readlink -f”$0“)”可能被认为通常更“强大”,但是,在Mac OS X上,给你readlink:非法选项 – f,并且对于可移植脚本没有实际好处,但更适用于引用已安装的二进制文件的位置,这些二进制文件可以符号链接和/或包含在$PATH目录中

标签:bash,linux,relative-path
来源: https://codeday.me/bug/20190823/1700415.html