【问题标题】:passing commandline parameter to .sh (shell) file将命令行参数传递给 .sh (shell) 文件
【发布时间】:2014-09-18 06:35:16
【问题描述】:

我正在终端执行这样的shell文件:

./cherrypicker.sh input.txt

input.txt 包含输入文本。

我的目的是直接将input text 作为 Web 界面的命令行参数传递

我检查了 cherrypicker.sh 文件,以获得一些线索。它有

tools/pos/pos.sh tools/pos $1 > $1.pos 2> /dev/null

如果$1 是来自input.txt 的文本,那么我可以直接传递文本。但是当我做echo $1 时,它会给出input.txt

我无法理解这里的> 以及2/dev/null 表示的是什么

任何解释都会很有意义。我检查了 .sh 文件,但文章说它的 shell 文件等同于 .bat 文件

Cherrypicker.sh

#!/bin/bash

echo "running stanford pos tagger..."
tools/pos/pos.sh tools/pos $1 > $1.pos 2> /dev/null

echo $1.pos

echo "running stanford ner tagger..."
tools/ner/ner.sh tools/ner $1 > $1.ner 2> /dev/null

echo "running charniak parsing..."
java MakeCharniakInput $1
tools/charniak-parser/PARSE/parseIt -l300 tools/charniak-parser/DATA/EN/ $1.charniakIN > $1.charniak

echo "running minipar parsing..."
tools/minipar/pdemo/pdemo -p tools/minipar/data/ < $1 > $1.minipar

echo "detecting mentions..."
java MentionDetection $1
tools/crf++/crf_test -m modelmd $1.crf > $1.pred
java CreateNPSpan $1 $1.pred


# if [[  $1 = "mp" ]]
# then
#   echo "creating feature file...."
#       java -cp .:edu.mit.jwi.jar CherryPick mp raw.txt
#       echo "classifying clusters using $1 model....."
#       tools/svmmentionpair/svm_classify raw.txt.mpsvm modelmp raw.txt.mppred
#       java MakeCluster raw.txt raw.txt.mppred
#   elif  [[ ( $1 = "mr" ) || ( $1 = "cr" )  ]]
#   then
    echo "creating feature file...."
    java -cp .:edu.mit.jwi.jar CherryPick cr $1
    echo "classifying clusters using cr joint model....."
    tools/svmrank/svm_classify $1 modelrank > $1.entities
#   else
#       echo "cannot classify clusters using *mysterious* model....."
#   fi


echo "creating output....."
java MakeResponse $1

【问题讨论】:

  • cherrypicker.sh 期望输入一个文件名,而不是一些文本。由于此脚本中使用的各种程序也需要一个文件名并且不能直接给出一些文本(特别是“java”),因此您首先需要创建一个包含您的文本的文件,然后将其传递给脚本。

标签: linux bash shell command-line


【解决方案1】:

命令:

   tools/pos/pos.sh tools/pos $1 > $1.pos 2> /dev/null

解释:

tools/pos/pos.sh  - script

tools/pos         - Positional argument 1 for pos.sh

$1                - Positional argument 2 for pos.sh

$1.pos            - Is a file which will hold the standard output of pos.sh

/dev/null         - is a null file which will hold standard error

tools/pos/pos.sh 在这种情况下采用两个位置参数 tools/pos$1(input.txt) 完成它的工作

并将tools/pos/pos.sh的标准输出重定向到文件$1.pos(input.txt.pos),该命令的&gt; $1.pos部分执行此操作并

上述命令的2&gt; /dev/null部分将标准错误重定向到/dev/null

【讨论】:

  • 谢谢亲爱的,你能告诉我./cherrypicker.sh input.txt如何直接传递输入文本而不是文本文件名。我已经用 shell 文件内容编辑了问题
  • 简短的回答是:你不能,你需要创建一个包含你的文本的文件并传递这个文件的名称。
  • 正如@Lars Noschinski 建议的那样,你不能传递文件的内容,你也不必传递, ./cherrypicker.sh 期望文件名作为参数,cherrypicker 使用这个文件名反过来将文件名作为参数传递给cherrypicker.sh中使用的其他命令和脚本,将文件名的内容传递给cherrypicker.sh将破坏脚本
  • @Ram 和 Lars:谢谢,但问题是我从 Gearman 工人那里得到输入作为“字符串文本”。当我收到继续的请求时,我可以像echo &lt;input text&gt; &gt; input.txt 一样吗?最后执行rm input.* 删除生成的文件,以便下次考虑新输入?
  • @user123 是的,您可以在运行 cherrypicker.sh input.txt 之前执行 echo "$stringText" &gt; input.txt 并且您不必删除 input.txt,因为单个 &gt; 重定向将覆盖 input.txt每次执行echo "$stringText" &gt; input.txt 时,$stringText 的内容。这有帮助吗?
【解决方案2】:

1) > 和 2> 分别操作标准输出和标准错误流重定向,因此您的输出进入 $1.pos 并且错误被重定向到 /dev/null(丢弃)

2) 如果您想将文件的内容作为输入提供,那么您可以将文件重定向为输入,例如:

tools/pos/pos.sh tools/pos < $1 > $1.pos 2> /dev/null

或通过管道:

cat $1 | tools/pos/pos.sh tools/pos > $1.pos 2> /dev/null

3) 如果你想要文件内容作为参数(我希望 input.txt 只是一行),那么试试这个:

tools/pos/pos.sh tools/pos `cat $1` > $1.pos 2> /dev/null

或者您可以尝试 xargs 每行执行一次命令:

cat $1 | xargs -I myargs tools/pos/pos.sh tools/pos myargs >> $1.pos 2> /dev/null

这里>>表示标准输出附加到同一个文件。

【讨论】:

  • 谢谢亲爱的,你能告诉我./cherrypicker.sh input.txt我如何直接传递输入文本而不是文本文件名。我已经用 shell 文件内容编辑了问题
  • 使用 xargs 为每一行调用您的命令: cat input.txt | xargs ./cherrypicker.sh
  • 顺便说一句,您可以在手册中查找所有这些信息,例如:“man xargs” 这是一项艰巨的学习,但值得(Unix 接口多年未更改)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2010-11-30
相关资源
最近更新 更多