質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

解決済

Node.jsからシェルスクリプトを実行して標準入力でデータを渡したい

削除済ユーザー
削除済ユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1回答

0評価

0クリップ

5096閲覧

投稿2018/01/15 09:35

###前提・実現したいこと
pythonからシェルスクリプトを実行するコードをNode.jsで書き直すことになりました。
シェルスクリプトには標準入力でJSONを渡しています。
以下のページを参考にしました。
https://nodejs.org/docs/latest-v8.x/api/child_process.html#child_process_child_process_spawn_command_args_options
https://nodejs.org/docs/latest-v8.x/api/stream.html#stream_writable_write_chunk_encoding_callback

###発生している問題・エラーメッセージ
標準入力を渡さない場合はシェルスクリプトが意図した通りに実行されました。
標準入力でシェルスクリプトにデータを渡そうとすると上手くいかず、下記のエラーメッセージが表示されるようになりました。
なぜか偶にエラーにならず実行されることもありますが、その場合はシェル側で標準入力が取得できず、標準入力を渡さず実行した場合と同じ結果になりました。

events.js:183 throw er; // Unhandled 'error' event ^ Error: write EPIPE at _errnoException (util.js:1022:11) at WriteWrap.afterWrite [as oncomplete] (net.js:867:14)

###該当のソースコード
$ node test.jsで実行しています。

javascript

// test.js const path = require('path') const spawn = require('child_process').spawn const script = path.resolve(__dirname, 'path', 'to', 'script') const data = { name: 'foo', age: 999 } const child = spawn(script) child.stdin.write(JSON.stringfy(data), 'utf8') child.stdin.end()

ちなみにpythonでは以下のようなコードで、意図した通りの動作が確認できました。

python

from os import path import subprocess import json SCRIPT = path.join( path.dirname(path.abspath(__file__)), 'path', 'to', 'script' ) DATA = { name: 'foo', age: 999 } subprocess.run( [SCRIPT], input=json.dumps(DATA).encode('utf-8'), check=True )

シェルスクリプトは以下のような感じです。直接実行してもpythonから実行しても問題ないので標準入力の受け取り方に問題があるとは思えませんが、念のため載せておきます。

bash

#!/bin/bash if [ ! -p /dev/stdin ]; then # 標準入力から何も渡ってこない場合はエラー exit 1 fi # 実行したい処理 do_something -r '...' < /dev/stdin | # 続く...

###試したこと
child.stdin.write()の戻り値を調べるとtrueでした。callbackも引数に渡すと、それが実行された上で上記のエラーが発生するようです。
spawn(script)spawn('cat') にしてchild.stdout.on('data', data => console.log(data))で標準出力を表示したら、エラーは発生せずに標準入力に渡したJSONがそのまま表示できました。

###補足情報(言語/FW/ツール等のバージョンなど)
OS: Ubuntu16.04
Node.js: v8.9.4

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。