为Bash脚本组织许多文件路径的最佳实践

时间:2017-02-06 23:21:26

标签: linux bash

我有一个bash脚本,可以将文件从一个位置复制到另一个位置。目前,所有文件路径都直接在脚本中定义为字符串。不幸的是,所有这些文件路径都炸毁了我的脚本。除了直接在脚本中之外,我如何以更好的方式组织所有文件路径?我应该使用配置文件吗?

2 个答案:

答案 0 :(得分:2)

我不太确定你的特殊要求。

这完全取决于脚本的大小,复杂性,重要性和寿命。

如果脚本很复杂(许多代码行具有重要的逻辑且具有很多依赖性),那么最好这样做:

  • 有一个环境设置脚本 - 或配置文件 - 创建标准化变量,如job_home,job_temp,job_log,job_log_archive等,并且具有一些具有共同父级的目录层次结构的命名约定(job_home in this案件)。使用大写字母可能是一个很好的想法,尽管它反对了Charles Duffy在评论中强调的POSIX标准。

  • 创建一个根据需要设置这些目录层次结构的函数。如果有意义,请建立一个功能库。

  • 在主脚本中提供环境设置和库脚本。

  • 小心避免路径的所有硬编码 - 改为使用标准环境变量。

答案 1 :(得分:0)

一个常见的约定是接受一个可以读取的文件名,以检索作为可选参数操作的其他文件的列表。

如果您没有将stdin用于任何其他目的,那么它也是用于此目的的合理流。例如:

printf '%s\0' /first/directory /second/directory >dirs
your-script < dirs

...或...

find /top/directory -mindepth 1 -type d -print0 | your-script

...或...

# pass a results from "find" via a filename
your-script -d <(find /top/directory -mindepth 1 -type d -print0)

使用上面的printf '%s\0'find -print0可确保列表以NUL分隔;这意味着恶意构造的目录名称(即。mkdir -p $'/top/directory/\n/etc/passwd\n')不能注入额外的参数(在上面的例子中,/etc/passwd)。

将NUL分隔的流读入数组,如下所示:

array=( )
while IFS= read -r -d '' dirname; do
  array+=( "$dirname" )
done