0

这是关于在 Linux 上工作的一般软件工程问题。假设我有源代码,主要是脚本。他们操作文本数据,将文本文件作为输入和输出。我正在考虑如何适当地分离 src 代码和数据,同时最大限度地减少工作期间的目录更改。我看到两种可能性:

  1. 将代码和数据混合在一起。通过这种方式,它最大限度地减少了目录转换并消除了在工作期间键入文件路径的需要。大多数时候我只是打电话:

    script1 data-in data-out # call script
    vi data-out # view result
    

    问题是随着代码和数据文件数量的增长,面对一长串代码和数据文件看起来很混乱。

  2. 将代码和数据分别放在两个文件夹中,比如“src”和“data”。当我在“src”文件夹中时,执行上述操作需要:

    script1 ../data/data-in ../data/data-out # call script
    vi ../data/data-out or cd data; vi data-out # view result
    

    父目录“../data”的额外输入会造成麻烦,尤其是在对脚本进行大量快速测试时。

您可能会建议我在数据文件夹中以相反的方式执行此操作。但是同样我需要调用../src/script1,再次输入前缀“../src”的麻烦。是的,我们可以将“src”添加到 PATH。但是,如果跨父子目录的脚本之间存在依赖关系怎么办?例如,假设“src”下有“subsrc/script2”,而在script1中,它调用“./subsrc/script2 ...”?然后在“data”文件夹中调用script1会抛出错误,因为“data”文件夹下没有“subsrc”文件夹。

代码和数据的良好分离以及最小化目录更改似乎是相互矛盾的要求。你有什么建议吗?谢谢。

4

2 回答 2

2

我会使用cd -shell 的功能加上设置 PATH 来解决这个问题——可能需要一些脚本来提供帮助。

我会确保构建程序的源目录位于我的 PATH 前面。我会cd进入数据目录或源目录(可能会使用数据目录或源目录捕获d=$PWD目录s=$PWD),然后切换到另一个(并再次捕获目录名称)。现在我可以使用 to switch 在两个目录之间来回cd -切换。

根据我是处于“代码工作”还是“数据工作”模式,我主要在适当的目录中工作。我可能有一个简单的脚本,(cd $source_directory; make "$@")这样如果我需要构建一些东西,我可以通过运行脚本来实现。我可以使用 swift cd -plusvimvim $other_dir/whichever.ext. 因为源目录在 PATH 上,所以我不必指定其中命令的完整路径。

我使用别名alias r="fc -e -"来重复命令。例如,要重复上一个vim命令,r v; 最后一个make命令,r m; 等等。

我一直在做这种事情。我使用的软件有大约 50 个目录用于完整构建,但我通常一次只在几个目录中工作。我有一组脚本可以根据我的工作位置重建系统(chk.xyzlibchk.pqrlib在相应的目录集中构建,例如;每个库的两个目录)。我更喜欢脚本而不是别名;您可以使用脚本更轻松地插入参数,而使用别名,您只能附加参数。该(cd $somewhere; make "$@")表示法不适用于别名。

于 2012-04-28T03:17:11.823 回答
2

编码有点多,但是你可以从命令行设置环境变量来指定数据目录吗?

export DATA_INPUT_DIR=/path/to/data
export DATA_OUTPUT_DIR=/path/to/outfiles

然后您的脚本可以处理与这些目录相关的文件:

# Set variables at the top of your scripts:
in_dir="${DATA_INPUT_DIR:-.}"   # Default to current directory
out_dir="${DATA_OUTPUT_DIR:-.}" # Defailt to current directory

# 1st arg is input file.  Prepend $DATA_INPUT_DIR unless path is absolute.
infile = "$1"
[ "${1::1}" == "/" ] || infile="$DATA_INPUT_DIR/$infile"


# 2nd arg is output file.  Prepend $DATA_OUTPUT_DIR unless path is absolute.
outfile = "$2"
[ "${2::1}" == "/" ] || outfile="$DATA_OUTPUT_DIR/$outfile"

# Remainder of the script uses $infile and $outfile.

当然,您也可以打开几个终端窗口:一些用于处理代码,另一些用于执行代码。:-)

于 2012-04-28T03:42:06.033 回答