2

現在のディレクトリ内のすべてのファイルのPGP署名を生成するための小さなScalaスクリプトを書いています。これは私が書いたものです:

object PGPSign {
    def main(args: Array[String]) {
    signFilesInDirectory(new java.io.File("."))
  }

  def signFilesInDirectory(dir: java.io.File) {
    if(!dir.exists())
      throw new java.io.FileNotFoundException
    if(!dir.isDirectory())
      throw new RuntimeException("Expecting directory")
    println("Signing files in: " + dir.getAbsolutePath())
    for{ file <- dir.listFiles 
      if !file.isDirectory //ignoring directories
      val fileName = file.getName()
      if !fileName.startsWith(".") //ignoring hidden files
    } { 
      ("gpg -ab " + fileName).!!
    }
  }
}

コンソールでは、コマンドgpg -ab FILE_NAMEはパスワードを要求します。Scalaスクリプトを実行すると、外部コマンドを呼び出した時点で次の例外が発生しました。

gpg: cannot open tty `/dev/tty': Device not configured
Exception in thread "main" java.lang.RuntimeException: Nonzero exit value: 2
at scala.sys.package$.error(package.scala:27)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:131)
at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:101)
at PGPSign$$anonfun$signFilesInDirectory$3.apply(PGPSign.scala:25)
at PGPSign$$anonfun$signFilesInDirectory$3.apply(PGPSign.scala:20)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:743)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:38)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:742)
at PGPSign$.signFilesInDirectory(PGPSign.scala:20)
at PGPSign$.main(PGPSign.scala:11)
at PGPSign.main(PGPSign.scala)

これは、外部コマンド(この場合はgpg)が何らかの入力を要求するという事実に関連していると思います。これが問題を引き起こしているものである場合(?)、Scalaから実行されたときに外部コマンド(任意の量の入力を要求する)を機能させる最も簡単な一般的な方法は何ですか?

4

1 に答える 1

3

gpgは、ttyからの読み取り/ ttyへの書き込みが可能であることを期待しています。これは、gpgが対話型シェルから開始されない限り使用できません。--no-ttyこの動作を無効にするには、このオプションを使用する必要があります。また、で有効にしたバッチモードが必要になる場合もあります--batch

于 2012-10-30T12:55:10.590 に答える