我在互联网上进行了搜索,没有发现任何简单的东西。
我有一个bash脚本,分为多个文件。主文件使用source
命令来要求另一个,依此类推。我不是专家,但是要安装我的脚本,我必须在$PATH
目录中移动一个文件。我知道有用于编译脚本的hsc,但这是不必要的。
我只需要创建一个脚本即可将每个source "file"
替换为文件本身。没那么难,但是为什么我没有在网上找到任何东西,而且似乎没人能找到?
谢谢!
答案 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
....