ある程度安全なシェルスクリプトを作成しています。つまり、コマンドのパラメーターを介して安全なデータを渡さず、できれば一時ファイルを使用しません。コマンドの標準入力に変数を渡すにはどうすればよいですか?または、それが不可能な場合、そのようなタスクに一時ファイルを正しく使用する方法は?
次のような単純なもの:
echo "$blah" | my_cmd
Stdinに値を渡すのは簡単です:
your-command <<< "$your_variable"
常に変数式を引用符で囲んでください!
'echo "$var" | command
操作は、標準入力がエコーされる行に制限されることを意味することに注意してください。端末も接続したい場合は、より洗練されたものにする必要があります。
{ echo "$var"; cat - ; } | command
( echo "$var"; cat - ) | command
つまり、最初の行は$var
の内容になりますが、残りはcat
から標準入力を読み取って取得されます。コマンドがあまり凝ったことをしない場合(コマンドライン編集を有効にするか、vim
のように実行してください)、それで問題ありません。そうでなければ、あなたは本当に空想を得る必要があります-私はexpect
またはその派生物の1つが適切である可能性が高いと思います。
コマンドライン表記は実際には同じです-しかし、括弧ではなく2番目のセミコロンが必要です。
(cat <<END
$passwd
END
) | command
cat
は実際には必要ありませんが、コードの構造を改善するのに役立ち、コマンドへの入力として括弧内のコマンドをより多く使用できます。
私はマーティンの答えが好きでしたが、変数の内容によってはいくつかの問題があります。この
your-command <<< """$your_variable"""
変数に「または!
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
)
これを他のコマンドにさらにリダイレクトする場合を除き、(
と)
を省略できます。
これを試して:
echo "$variable" | command
この堅牢で移植性の高い方法は、すでにコメントに記載されています。スタンドアロンの回答である必要があります。
printf '%s' "$var" | my_cmd
または
printf '%s\n' "$var" | my_cmd
ノート:
echo
よりも優れています。理由は次のとおりです。 なぜprintf
はecho
よりも優れているのですか? printf "$var"
が間違っています。最初の引数は、%s
や\n
などのさまざまなシーケンスが解釈される形式です。変数を正しく渡すには、形式として解釈してはなりません。通常、変数には末尾の改行は含まれません。前のコマンド(%s
を使用)は、変数をそのまま渡します。ただし、テキストで動作するツールは、不完全な行を無視するか、文句を言う場合があります( なぜテキストファイルが改行で終わる必要があるのかを参照してください )。したがって、変数の内容に改行文字を追加する後者のコマンド(%s\n
付き)が必要になる場合があります。非自明の事実:
<<<"$var" my_cmd
)は改行を追加します。my_cmd
の空でない標準入力になります。