sort:无法在'/ Data'中创建临时文件:权限被拒绝

时间:2017-03-02 20:53:00

标签: makefile permissions temp

我最近使用其他人编写的makefile开始使用Tuxedo套件管道。我们一直在努力解决这个特殊的节目

reformat_read_group_tracking:
    @echo "Here we go!"
    @for file in $(FILELIST_CUFFLINKS_REFORMAT); do \
    awk '{if (NR!=1) {print}}' $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/genes.read_group_tracking > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp.txt;\
    chmod 775 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp.txt;\
    sort -nk 3,3 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp.txt | sort -nk 2,2 | sort -nk 1,1 > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp2.txt;\
    chmod 775 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp2.txt;\
    perl formatCuffDiffOutput.pl $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp2.txt > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes.read_group_tracking;\
    chmod 775 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes.read_group_tracking;\
    awk '{print $$1}' $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes.read_group_tracking > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp.read_group_tracking;\
    awk -v OFS='\t' '{print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$9}' $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes.read_group_tracking > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp2.read_group_tracking;\
    awk -v OFS='\t' -F '\t' '{print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$9,$$10,$$11,$$12,$$13,$$14}' $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/gene_exp.diff > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/gene_exp_temp.diff;\
    chmod 775 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp.read_group_tracking;\
    chmod 775 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp2.read_group_tracking;\
    chmod 775 $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/gene_exp_temp.diff;\
    paste $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp.read_group_tracking $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/gene_exp_temp.diff $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp2.read_group_tracking > $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/final_reformat_genes.read_group_tracking;\
    rm $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes.read_group_tracking;\
    rm $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp.read_group_tracking;\
    rm $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/reformatted_genes_temp2.read_group_tracking;\
    rm $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/gene_exp_temp.diff;\
    rm $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp2.txt;\
    rm $(DIRPATH)/RNA_SEQ/Analysis_062216/$${file}/temp.txt;\
    done ;

但我们一直遇到错误,编写代码的人现在无法提供帮助。我们遇到的问题是,每当我们运行该节时,它都会给我们带来以下错误:

sort: cannot create temporary file in '/Data': Permission denied

我们当中没有人确切知道发生了什么,但是我们想知道这个问题是否是该节中任何内容的结果,或者它是否是运行它的系统的问题(这个makefile写在一个不同的机器,所以staza本身以前工作过,但它给我们这个错误信息。)

我希望这足以说明一般问题是什么,但如果需要更多信息,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:0)

删除了所有可怕的错误,这是一个简单的问题"这个错误信息意味着什么?"并且因此在Stack Overflow上不是严格可接受的。

sort命令允许您通过设置TMPDIR环境变量来指定用于其临时文件的目录。你的代码中可能有一些不相关的部分设置这个变量是出于完全不相关的原因;而且很可能,它应该简单地使用小写变量名称,以避免与sort和其他一些实用程序使用的保留变量发生冲突(大写保留用于系统变量,但其他语言的约定有时会引诱人们进入相信使用大写字母作为私有变量是没有问题甚至建议的做法。)

Makefile片段过于复杂且毛茸茸而无法正确重构,但我可以提供一些观察结果;

  • sort -options | sort -different -options | sort -others -still可能完全没用。第三个sort将重新排序所有内容,因此前两个结果将丢失。我们可以推测,目的是将前两个用于辅助密钥,但通常的方法是指定多个-k选项(如果没有它们,则无法保证未指定字段的排序顺序最后一次sort调用将被保留或稳定。)
  • chmodrm以及大多数其他标准的面向文件的Unix实用程序允许您一次指定多个文件名。 rm one tworm one; rm two更经济,更易读,特别是如果路径名很长且重复(尽管您可能还想重构它们)。
  • 无论如何,chmod命令在这里看起来多余,特别是在配方末尾要删除的文件上。如果您在权限方面遇到问题,可以在长命令的开头发出更轻松的umask
  • 通过将Makefile放在目标前隐藏@,这样你就无法看到他们在做什么,这是我的一个小小的烦恼。拿出来让你可以看到你在做什么。如果make对您来说过于冗长,您可以使用make -s轻松运行它以保持安静。你知道,当你在没有-s选项的情况下调用它时,它会打印它正在做的事情。
  • 循环Makefile目标中的文件是反模式。正确的方法是命名要生成的文件,并告诉make如何从单个输入文件中创建每组输出文件。
  • 这里长文件名的大量重复性显然会削弱易读性。为了Pete的缘故,定义一个常量并使用它。

完全脱离袖口,这是一个未经测试的,可能是破坏的重构这一尝试,主要是为了让你了解我所得到的,而不是真正从这个混乱中产生工作代码。

# Assuming GNU Make for the $(foreach ...) and $(patsubst ...) functions
# Not clear whether there are other output files you actually want?
resultfiles := final_reformat_genes.read_group_tracking
reformat_read_group_tracking: $(foreach d,$(resultfiles),\
        $(patsubst %,$(DIRPATH)/RNA_SEQ/Analysis_062216/%/$d,\
                    $(FILELIST_CUFFLINKS_REFORMAT)))

%/reformatted_genes.read_group_tracking: %/genes.read_group_tracking
    # A slightly more economical way to say "awk '{if (NR!=1) {print}}'"
    sed 1d  $< \
    | sort -nk1,1 \
    | perl formatCuffDiffOutput.pl >$@

%/gene_exp_temp.diff: %/gene_exp.diff
    # A slightly more economical way to say "awk -v OFS='\t' -F '\t' '{print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$9,$$10,$$11,$$12,$$13,$$14}'"
    cut -f2-14 $< >$@

%/reformatted_genes_temp.read_group_tracking: %/reformatted_genes.read_group_tracking
   awk '{print $$1}' $< >$@

%/reformatted_genes_temp2.read_group_tracking: %/reformatted_genes.read_group_tracking
    # A more economical way to say "awk -v OFS='\t' '{print $$2,$$3,$$4,$$5,$$6,$$7,$$8,$$9}'"
    cut -f2-9 $< >$@

%/final_reformat_genes.read_group_tracking: \
        %/reformatted_genes_temp.read_group_tracking \
        %/gene_exp_temp.diff \
        %/reformatted_genes_temp2.read_group_tracking 
    paste $^ >$@

这里有相当多的推测,但你应该看看它与你的原始剧本有什么关系。您可能希望添加目标clean以单独删除所有临时文件,但在许多情况下,make会自动清除它看到的文件不是最终结果所必需的文件。