将bash脚本链接到一个脚本文件

时间:2018-10-18 09:43:12

标签: bash

我在互联网上进行了搜索,没有发现任何简单的东西。

我有一个bash脚本,分为多个文件。主文件使用source命令来要求另一个,依此类推。我不是专家,但是要安装我的脚本,我必须在$PATH目录中移动一个文件。我知道有用于编译脚本的hsc,但这是不必要的。

我只需要创建一个脚本即可将每个source "file"替换为文件本身。没那么难,但是为什么我没有在网上找到任何东西,而且似乎没人能找到?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以以合理的可靠性执行source $0-在$ 0不是完整路径并且脚本更改目录或更改$ path时发出警告。但是,我想您可能还想构造子例程。

在DOS的早期,我有一个约定,如果$ 1是--call,则$ 2是转到和转移2的标签,尽管您必须在转移等之前捕获$ 0。

但是bash支持功能,因此您不需要使用source $0
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-8.html
只需将子脚本的主体放在函数中,然后在脚本中调用它即可。

当然,您可能仍然需要--call命令行功能,以便可以直接访问该功能,并进行单元测试。

答案 1 :(得分:0)

实际上,您可以对脚本进行较小的安装,而无需更改脚本。

想象一下,您的脚本都位于const locations = [{name:"dave", location:["home","work","pub"]}, {name:"alice", location:["school","college","university"]}, {name:"fred", location:["us","uk"]} ]; // Will work even if you have multiple Freds in your data you could also // use filter + map here, but reduce does it one shot // const allMatches = (name) => { return locations.reduce(((memo, entry, index) => { if(entry.name === name) { memo[name] = entry.location; } return memo; }), {}) }; // If you know you will only have a single "Fred", then it becomes even simpler // const singleMatch = (name) => { return locations.find(entry => entry.name === name).location; }; console.log(singleMatch('fred')); console.log(allMatches('fred')); 中:

/path/to/scripts/

它可以从此目录完美运行。然后,您有两种选择来安装它,而无需进行任何干预。

安装包装脚本:

您可以安装包装器脚本,而不是在$ ls /path/to/scripts main source1 source2 source3 ... 中进行复制:

/path/to/PATHDIR

安装软链接并更新#!/usr/bin/env bash cd /path/to/scripts ./main "$@"

main

更新main,使其始终先更改工作目录。

$ cd /path/to/PATHDIR
$ ln /path/to/scripts/main .

#!/usr/bin/env bash
cd /path/to/scripts
....