Bash:echoまたは<<が良いです。

Bash:echoまたは<<が良いです。

入力を渡すにはどのような方が良いですか?

 > echo 'test' | base64
dGVzdAo=

 > base64 <<< 'test'
dGVzdAo=

また、変数にはどのような方法を使用する必要がありますか?

 > t='test'

 > echo "$t" | base64
dGVzdAo=

 > base64 <<< "$t"
dGVzdAo=

ベストアンサー1

<<<zshhere-stringは1990年代初頭に導入されたhere-document(およびUnixポート)の略形式でrcあり、以後多くの他のシェルに(変形とともに)コピーされました。

ここで説明したのと同じ方法で実装されます。とを含むzshほとんどのシェルは、bashBourneシェル(1970年代後半にここに文書を導入したシェル)で行われているように、一時ファイルを削除してこれを行います。

これを行うとき:

cmd <<< 'something'

シェルは同様の操作を行います。

file=$(mktemp)
printf 'something\n' > "$file"
{
  rm -f -- "$file" && cmd
} < "$file"

(もちろん、これらのコマンドを実行せずに、すべてmktemp、、、printfrm内部的に実行されます。)

一部のシェルは、パイプとは別のプロセス(分岐されたコマンドまたは小さなファイル/文字列になることができるデフォルトのシェルプロセス)を使用してデータを提供します。一部のシェルは/dev/null空のhereドキュメントを使用するように戻すことができます(ここで文字列はrc改行文字が追加されていない限り空にすることはできません)。

一時ファイルを使用して実装すると、いくつかの利点があります。

  • 分岐したプロセスはありません。
  • 入力は検索可能です。コマンドは入力からデータを前後に読み取り、別の場所から再度読み取ることができますが、入力がパイプの場合はこれを実行できません。ただし、移植可能なshスクリプトではこれに依存することはできません。

いくつかの欠点:

  • コンテンツには、以下を除いてzshNULバイトを含めることはできません。
  • 以外のrc改行文字で終わらない入力は提供できません。
  • 一時ファイルの作成が失敗する可能性があります(たとえば、残りのスペースがない場合、または一部の実装が制限すぎる場合など)$TMPDIRumask
  • データは永続ストレージに保存されます。ファイルが削除される前に削除されても、readデータは最終的にディスクにコミットされる可能性があります。つまり、誰かがディスクを入手できる場合は回復できます。

存在する:

printf '%s\n' "$something" | cmd

(ここでasのprintf代わりに使用することは、任意のデータと一緒に使用することはできません)。echoecho

同時に実行される 2 つのプロセスがあります。1 つはパイプを介して別のプロセスに出力を提供します。 AT&T をcmd使用する組み込みコマンドまたは複合コマンドまたは関数の場合、そのコマンドは現在シェルで実行されますが、そうでない場合は子プロセスで実行されるため、同様の操作は機能しません。zshkshbash -o lastpipeecho x | read var

これには次の利点があります。

  • 移植可能である( の逆<<<<<移植可能である)
  • <<<上記の欠点はありません
  • zshシェル(zsh組み込みコマンドにNULバイトを渡すことができる唯一のシェル)以外のシェルからNULバイトを提供するには、次のようにしますprintf '\0' | cmd

欠点:

  • cmd上記のように、追加のプロセスといくつかのシェルの子プロセスで実行されるという事実
  • 入力内容を取得できません。

base64エンコーディングが必要な場合は、test次のようになります。

printf test | base64

または

printf %s "$data" | base64

任意のデータの場合。

Base64エンコーディングが提供されていますtest<newline>

おすすめ記事