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

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

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

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

Deno

Denoとは、Node.jsを作ったライアン・ダールが作成したJavaScriptおよびTypeScriptのランタイム。単一の実行ファイルで提供され、外部コードのフェッチに対応しているため、別途パッケージ管理システムを必要としません。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

696閲覧

複数行入力->複数行出力のテストの書き方(Bash+bats+Deno+Typescript+teip)

Ng_

総合スコア26

bash

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

Deno

Denoとは、Node.jsを作ったライアン・ダールが作成したJavaScriptおよびTypeScriptのランタイム。単一の実行ファイルで提供され、外部コードのフェッチに対応しているため、別途パッケージ管理システムを必要としません。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2022/04/16 13:03

編集2022/04/17 01:49

teipコマンドをDeno(Typescript)で実装しています。
テストをbatsで書こうとしているのですが、シェルに慣れていなくて複数行の入出力の書き方に苦労しています。

コマンドの処理例

bash

1echo 111\\n222\\n333\\n444\\n555\\n666\\n | deno run -q --allow-run main.ts -l 2,4-5 -- sed 's/./@/' 2> 111 3> @22 4> 333 5> @44 6> @55 7> 666

Deno.argsをmainでパースし、Deno.runで選択された行(上の例だと2,4,5行目)だけ一行づつ処理しstring[]に格納しています。
対象じゃない行は処理せずにstringp[]に格納しています。
最後にstring[]をstdoutに書き出します。

typescript

1async function execCommands( 2 command: string[], 3 input: string 4 ): Promise<Result<string, string>> { 5 const p = Deno.run({ 6 cmd: ["bash"], 7 stdin: "piped", 8 stdout: "piped", 9 stderr: "inherit", 10 }); 11 await p.stdin?.write(utf8Encode(`echo -n ${input} | ${command.join(" ")}`)); 12 await p.stdin?.close(); 13 const exitCode = (await p.status()).code; 14 const output = await p.output(); 15 if (exitCode == 1) { 16 return new Err("teip: Commands failed"); 17 } 18 if (output.length == 0) { 19 return new Err("teip: Output of given commands is exhausted"); 20 } 21 return new Ok(utf8Decode(output)); 22 }

上記の例をbatsのテストケースとし記述しようとしています。

bash

1@test '-l' { 2 actual="$(echo -e 111\\n222\\n333\\n444\\n555\\n666\\n | deno run -q --allow-run main.ts -l 2,4-5 -- sed 's/./@/')" 3 expected='111\\n@22\\n333\\n@44\\n@55\\n666\\n' 4 assert_equal $actual $expected 5}

実行結果

bash

1teip-ts/test [main●] » bats test.sh 2test.sh 3 ✗ -l 4 (from function `assert_equal' in file test_helper/bats-assert/src/assert_equal.bash, line 40, 5 in test file test.sh, line 17) 6 `assert_equal $actual $expected' failed 7 8 -- values do not equal -- 9 expected : @22 10 actual : 111 11 --

テストを実行するとactualもexpectedも想定したものではないものになってしまいます。(特にexpectedの値がなぜこうなるのかよくわからない。)
actualで複数行をパイプで渡す部分がまずいと考えているのですが、どう書くとよいでしょうか?
また、この書き方に限らず標準入出力のテストをシェルで書く際のtipsがあれば教えてください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

bash

1@test '-l' { 2actual=`echo -e '111\n222\n333\n444\n555\n666' | deno run -q --allow-run main.ts -l 2,4-5 -- sed 's/./@/'` 3expected=`echo -e '111\n@22\n333\n@44\n@55\n666\n'` 4assert_equal "$actual" "$expected" 5}

シェルスクリプトで変数に改行コードを含める方法

投稿2022/04/16 16:48

編集2022/04/16 16:49
Ng_

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問