web-dev-qa-db-ja.com

変数の値をコマンドの標準入力に渡す方法は?

ある程度安全なシェルスクリプトを作成しています。つまり、コマンドのパラメーターを介して安全なデータを渡さず、できれば一時ファイルを使用しません。コマンドの標準入力に変数を渡すにはどうすればよいですか?または、それが不可能な場合、そのようなタスクに一時ファイルを正しく使用する方法は?

87
user283145

次のような単純なもの:

echo "$blah" | my_cmd
67

Stdinに値を渡すのは簡単です:

your-command <<< "$your_variable"

常に変数式を引用符で囲んでください!

156
Martin

'echo "$var" | command操作は、標準入力がエコーされる行に制限されることを意味することに注意してください。端末も接続したい場合は、より洗練されたものにする必要があります。

{ echo "$var"; cat - ; } | command

( echo "$var"; cat -   ) | command

つまり、最初の行は$varの内容になりますが、残りはcatから標準入力を読み取って取得されます。コマンドがあまり凝ったことをしない場合(コマンドライン編集を有効にするか、vimのように実行してください)、それで問題ありません。そうでなければ、あなたは本当に空想を得る必要があります-私はexpectまたはその派生物の1つが適切である可能性が高いと思います。

コマンドライン表記は実際には同じです-しかし、括弧ではなく2番目のセミコロンが必要です。

17
(cat <<END
$passwd
END
) | command

catは実際には必要ありませんが、コードの構造を改善するのに役立ち、コマンドへの入力として括弧内のコマンドをより多く使用できます。

15
PoltoS

私はマーティンの答えが好きでしたが、変数の内容によってはいくつかの問題があります。この

your-command <<< """$your_variable"""

変数に「または!

13
Robert Jacobs

Martinの答えによると、ここでStringsと呼ばれるbash機能があります(これ自体は、より広くサポートされているHere Documents機能)。

http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings

3.6.7ここでの文字列

ヒアドキュメントのバリアントで、形式は次のとおりです。

<<< Word

Wordは展開され、標準入力でコマンドに提供されます。

Here Stringsはbashのみのように見えることに注意してください。そのため、移植性を向上させるために、元のHere Documents機能を使用したほうが良いと思われます。

( cat <<EOF
$variable
EOF
) | cmd

または、上記のより単純なバリアント:

(cmd <<EOF
$variable
EOF
)

これを他のコマンドにさらにリダイレクトする場合を除き、()を省略できます。

7
cnst

これを試して:

echo "$variable" | command
4
unbeli

この堅牢で移植性の高い方法は、すでにコメントに記載されています。スタンドアロンの回答である必要があります。

printf '%s' "$var" | my_cmd

または

printf '%s\n' "$var" | my_cmd

ノート:

  • echoよりも優れています。理由は次のとおりです。 なぜprintfechoよりも優れているのですか?
  • printf "$var"が間違っています。最初の引数は、%s\nなどのさまざまなシーケンスが解釈される形式です。変数を正しく渡すには、形式として解釈してはなりません。
  • 通常、変数には末尾の改行は含まれません。前のコマンド(%sを使用)は、変数をそのまま渡します。ただし、テキストで動作するツールは、不完全な行を無視するか、文句を言う場合があります( なぜテキストファイルが改行で終わる必要があるのか​​を参照してください )。したがって、変数の内容に改行文字を追加する後者のコマンド(%s\n付き)が必要になる場合があります。非自明の事実:

    • ここで、Bashの文字列(<<<"$var" my_cmd)は改行を追加します。
    • 改行を追加するメソッドは、変数が空または未定義であっても、my_cmdの空でない標準入力になります。
1