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等中,我非常怀疑是这种情况) .

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

标签:bash,linux,relative-path

来源: https://codeday.me/bug/20190823/1700415.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值