【问题标题】:Automate command lines自动化命令行
【发布时间】:2015-04-14 04:55:08
【问题描述】:

我执行以下 cmd 行,现在我需要将其放入我可以调用的脚本中,并将 file1、file2、file3 作为参数传递。

sort file1.csv > file1.csv.sorted
sort file2.csv > file2.csv.sorted 
diff --speed-large-files \
  file1.csv.sorted \
  file2.csv.sorted \
  > file3.difftmp
rm file1.csv.sorted
rm file2.csv.sorted

我尝试创建 bash 脚本,但以下 eval 不起作用:

s="diff --speed-large-files $file1.csv.sorted $file2.csv.sorted > $file3"
eval s

我不一定需要创建一个 bash 脚本,但我需要自动化这个过程,以便其他进程可以调用它并传递参数。

【问题讨论】:

标签: bash automation


【解决方案1】:

不要在这里使用eval;一个简单的函数就足够了:

filediff() {
   sort "$1".csv > "$1".csv.sorted
   sort "$2".csv > "$2".csv.sorted 
   diff --speed-large-files "$1".csv.sorted "$2".csv.sorted > "$3".difftmp
   rm "$1".csv.sorted
   rm "$2".csv.sorted
}

正如 Tom Fenech 所建议的,您还可以使用进程替换并避免创建临时文件。

【讨论】:

    【解决方案2】:

    当您使用 bash 时,您可以利用进程替换:

    #!/bin/bash
    diff --speed-large-files <(sort "$1") <(sort "$2")
    

    您可以将两个文件名作为参数传递给脚本。这避免了临时文件的创建和手动清理的需要。

    【讨论】:

    • 这是个好建议。但是,当我在两个 16GB 和 17GB 的大型文件上运行 diff 时,我在使用进程替换时内存不足。
    • @Edijs 有这么大的文件,我对你的内存不足并不感到惊讶!
    【解决方案3】:

    我认为,你可以这样做

    k=$(s)
    

    所以k 是一个变量,其中存储了从命令s 返回的结果。如果要使用字符串作为 s 命令,请执行 $("cmd")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2016-01-02
      • 1970-01-01
      相关资源
      最近更新 更多