私は、ある程度安全でなければならない、つまりコマンドのパラメーターを通じて安全なデータを渡さず、できれば一時ファイルを使用しないシェルスクリプトを書いています。コマンドの標準入力に変数を渡すにはどうすればよいですか?または、それが不可能な場合、そのようなタスクに一時ファイルを正しく使用するにはどうすればよいですか?
私は、ある程度安全でなければならない、つまりコマンドのパラメーターを通じて安全なデータを渡さず、できれば一時ファイルを使用しないシェルスクリプトを書いています。コマンドの標準入力に変数を渡すにはどうすればよいですか?または、それが不可能な場合、そのようなタスクに一時ファイルを正しく使用するにはどうすればよいですか?
回答:
次のように単純なもの:
echo "$blah" | my_cmd
echo "$blah"
。
printf '%s\n' "$blah"
ませんか?1つの変更(に多くの落とし穴を避けることとecho
ステファンの優れた答えはで詳細にに入るの仕様、なぜですprintf
より良いよりもecho
?上のUnixとLinux、またはそのアプリケーション使用法セクションecho
仕様それは完全だより簡潔にタッチ)合理的な答え。
値を渡すstdin
にはbashすることなど簡単なようです:
your-command <<< "$your_variable"
常に変数式を引用符で囲むようにしてください!
これはおそらくでのみ機能し
bash
、では機能しないことに注意してくださいsh
。
<<<
が利用可能であるとは限りません。私が知る限り、それらはPOSIXベースではありません。で実行している限り、期待どおりに動作しますbash
。彼らのOPは特に「bash」ではなく「shell」と言ったので、私はそれについてのみ述べます。彼は質問にタグを付けましたがbash
...それでも、これは明らかに容認できる答えです。
echo
が、パイプの作成のためにメソッドを使用すると、機密情報がより簡単に漏洩する可能性があります。herestringコマンドは完全にによって処理されますがbash
、(このように)この状況では、bashで機能することを理解している必要があります。そうでない場合、herestringをサポートしない結果として生成されるエラーメッセージも、上記の情報をリークします。
echo
は組み込みです。パイプはありませんよね?それはUnixですが、それほど多くのUnixになることはできません。
printf '%s\n' "$var"
同じ結果を生成しますecho "$var"
が、たとえば、var=-en
bashを必要としない場合でもブレークしません。
' echo "$var" | command
操作は、標準入力がエコーされた行に制限されることを意味することに注意してください。端末も接続したい場合は、より洗練されている必要があります。
{ echo "$var"; cat - ; } | command
( echo "$var"; cat - ) | command
これは、最初の行が内容であることを意味します$var
が、残りはcat
その標準入力を読み取ることから来ます。コマンドがあまり凝った動作を行わない場合(コマンドライン編集をオンにするか、または同様に実行する場合vim
)は問題ありません。そうでなければ、あなたは本当に空想を得る必要があります-私は、expect
またはその派生物の1つが適切であると思います。
コマンドラインの表記は実質的に同じですが、2番目のセミコロンは括弧では必要ですが、括弧では必要ありません。
( echo "$LIST"; cat - ) | sed 1q
これは私にとってはうまくいきますが、このスクリプトを実行するときにctrl dを押す必要がありますか?
cat -
は、EOFまたは割り込みが発生するまでキーボードから読み続けるため、control-Dを入力してEOFを通知する必要があります。
cat
最初の行のように、端末入力が必要ない場合は、まったく使用する必要はありません。またはcat
、ファイルの一覧表示に使用できます。または...コマンドで端末入力を読み取る場合は、入力の最後に達したことを通知する必要があります。またはあなたが使うことができます( echo "$var"; sed /quit/q - ) | command
; これは、「quit」を含む行を入力するまで続きます。あなたはそれをどのように扱うかに無限に進歩的であることができます。ユーザーがエクアドルを使い始めたときに機能しなくなったプログラムの古い都市伝説に注意してください。彼らは首都キトの名前を入力し、プログラムは終了しました。
echo "$LIST" | sed 1q | ...
ですか?それはあなたが何をしているのかによります。<<EOF
表記は、ファイルダウン独自のどこかの行の先頭にEOFを要求すべきです。私はそれを使用しないと思います—しかし、あなたが何を達成しようとしているのかまだわかりません。単純な、echo "$LIST" | command
またはecho $LIST | command
おそらく実際には十分でしょう(そして、2つの間の違いの重要性を知っていることが重要です)。
マーティンの答えが好きでしたが、変数の内容によっては問題が発生しました。この
your-command <<< """$your_variable"""
変数に "または!
foo1=-; foo2='"'; foo3=\!; cat<<<"$foo1"; cat<<<"$foo2"; cat<<<"$foo3"
ん。問題なく動作します。3つ"
は正確には何をしますか?申し訳ありませんが、空の文字列を追加して追加しています。
(cat <<END
$passwd
END
) | command
これcat
は実際には必要ありませんが、コードをより適切に構造化するのに役立ち、コマンドへの入力として括弧内により多くのコマンドを使用することができます。
$passwd
マーティンの回答によると、ヒア文字列と呼ばれるbash機能があります(これ自体が、より広くサポートされているヒアドキュメント機能のバリアントです)。
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7ヒア文字列
ヒアドキュメントの変形であり、フォーマットは次のとおりです。
<<< word
単語が展開され、標準入力でコマンドに提供されます。
ヒア文字列はbashのみのように見えるので、移植性を向上させるために、PoltOSの回答にあるように、オリジナルのヒアドキュメント機能を使用することをお勧めします。
( cat <<EOF
$variable
EOF
) | cmd
または、上記のより簡単なバリアント:
(cmd <<EOF
$variable
EOF
)
これを他のコマンドにさらにリダイレクトしたくない場合は(
、およびを省略でき)
ます。
この堅牢で移植可能な方法は、すでにコメントに記載されています。スタンドアロンの答えである必要があります。
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
は、変数が空または未定義であっても、空でないstdinになります。これを試して:
echo "$variable" | command
echo
は組み込みなので、psに表示するプロセスはありません
echo "$variable"
。
ただやる:
printf "$my_var" | my_cmd
varにスペースが含まれていない場合は、引用符を省略できます。
bashを使用している場合は、次のようにすることもできます。
echo -n "$my_var" | my_cmd
末尾に改行を追加して変数をパイプするため、-nなしでエコーを使用しないでください。
%s
何も出力しません。my_var="%s"; printf "$my_var";
-たぶんprintf "%s" "$my_var" | my_cmd
やってみますか?
$PATH
か?したがって、次のcat
ように置き換えることができます/bin/cat "$@" | tee /attacker/can/read/this/file