这是关于在Linux上工作的一般软件工程问题。假设我有源代码,主要是脚本。他们操纵文本数据,将文本文件作为输入和输出。我正在考虑如何在工作期间最小化目录更改的同时适当地分离src代码和数据。我看到两种可能性:
将代码和数据混合在一起。通过这种方式,它可以最大限度地减少目录转换,并且无需在工作期间键入文件路径。大多数时候我只是打电话:
script1 data-in data-out # call script
vi data-out # view result
问题是,随着代码和数据文件数量的增加,面对代码和数据文件的长列表看起来很乱。
将代码和数据分开放在两个文件夹中,例如“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”的麻烦。是的,我们可以在PATH中添加“src”。但是,如果跨父子目录的脚本之间存在依赖关系,该怎么办?例如,假设在“src”下有“subsrc / script2”,并且在script1中,它调用“./subsrc/script2 ...”?然后调用“data”文件夹中的script1会抛出错误,因为“data”文件夹下没有“subsrc”文件夹。
良好的代码分离&数据和最小化目录更改似乎是相互冲突的要求。你有什么建议吗?感谢。
答案 0 :(得分:2)
我会使用shell的cd -
工具,并设置PATH对其进行排序 - 可能需要一些脚本来帮助。
我确保构建程序的源目录位于我前面的PATH上。我将cd
放入数据目录或源目录中(可能为数据目录捕获d=$PWD
目录,或者为源目录捕获s=$PWD
),然后切换到另一个(并再次捕获目录名称)。现在,我可以使用cd -
来切换两个目录之间来回切换。
取决于我是否使用代码工作'或者'数据工作'模式,我主要在适当的目录中工作。我可能有一个简单的脚本(cd $source_directory; make "$@")
,所以如果我需要构建一些东西,我可以通过运行脚本来实现。我可以使用快速cd -
加vim
或vim $other_dir/whichever.ext
来编辑任一目录中的文件。因为源目录在PATH上,所以我不必指定其中命令的完整路径。
我使用别名alias r="fc -e -"
来重复命令。例如,要重复上一个vim
命令,r v
;最后make
命令,r m
;等等。
我一直都在做这种事情。我工作的软件有大约50个完整版本的目录,但我通常只是一次只能工作几个。我有一组脚本来重建系统,这些脚本基于我工作的地方(chk.xyzlib
和chk.pqrlib
来构建相应的目录集,例如;每个库有两个目录)。我更喜欢脚本别名;您可以使用脚本更轻松地插入参数,而使用别名,您只能附加参数。 (cd $somewhere; make "$@")
表示法不适用于别名。
答案 1 :(得分: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.
当然,您也可以打开几个终端窗口:一些用于处理代码,另一些用于执行代码。 : - )