入力を渡すにはどのような方が良いですか?
> echo 'test' | base64
dGVzdAo=
> base64 <<< 'test'
dGVzdAo=
また、変数にはどのような方法を使用する必要がありますか?
> t='test'
> echo "$t" | base64
dGVzdAo=
> base64 <<< "$t"
dGVzdAo=
ベストアンサー1
<<<
zsh
here-stringは1990年代初頭に導入されたhere-document(およびUnixポート)の略形式でrc
あり、以後多くの他のシェルに(変形とともに)コピーされました。
ここで説明したのと同じ方法で実装されます。とを含むzsh
ほとんどのシェルは、bash
Bourneシェル(1970年代後半にここに文書を導入したシェル)で行われているように、一時ファイルを削除してこれを行います。
これを行うとき:
cmd <<< 'something'
シェルは同様の操作を行います。
file=$(mktemp)
printf 'something\n' > "$file"
{
rm -f -- "$file" && cmd
} < "$file"
(もちろん、これらのコマンドを実行せずに、すべてmktemp
、、、printf
はrm
内部的に実行されます。)
一部のシェルは、パイプとは別のプロセス(分岐されたコマンドまたは小さなファイル/文字列になることができるデフォルトのシェルプロセス)を使用してデータを提供します。一部のシェルは/dev/null
空のhereドキュメントを使用するように戻すことができます(ここで文字列はrc
改行文字が追加されていない限り空にすることはできません)。
一時ファイルを使用して実装すると、いくつかの利点があります。
- 分岐したプロセスはありません。
- 入力は検索可能です。コマンドは入力からデータを前後に読み取り、別の場所から再度読み取ることができますが、入力がパイプの場合はこれを実行できません。ただし、移植可能な
sh
スクリプトではこれに依存することはできません。
いくつかの欠点:
- コンテンツには、以下を除いて
zsh
NULバイトを含めることはできません。 - 以外の
rc
改行文字で終わらない入力は提供できません。 - 一時ファイルの作成が失敗する可能性があります(たとえば、残りのスペースがない場合、または一部の実装が制限すぎる場合など)
$TMPDIR
。umask
- データは永続ストレージに保存されます。ファイルが削除される前に削除されても、
read
データは最終的にディスクにコミットされる可能性があります。つまり、誰かがディスクを入手できる場合は回復できます。
存在する:
printf '%s\n' "$something" | cmd
(ここでasのprintf
代わりに使用することは、任意のデータと一緒に使用することはできません)。echo
echo
同時に実行される 2 つのプロセスがあります。1 つはパイプを介して別のプロセスに出力を提供します。 AT&T をcmd
使用する組み込みコマンドまたは複合コマンドまたは関数の場合、そのコマンドは現在シェルで実行されますが、そうでない場合は子プロセスで実行されるため、同様の操作は機能しません。zsh
ksh
bash -o lastpipe
echo x | read var
これには次の利点があります。
- 移植可能である( の逆
<<<
、<<
移植可能である) <<<
上記の欠点はありませんzsh
シェル(zsh
組み込みコマンドにNULバイトを渡すことができる唯一のシェル)以外のシェルからNULバイトを提供するには、次のようにしますprintf '\0' | cmd
。
欠点:
cmd
上記のように、追加のプロセスといくつかのシェルの子プロセスで実行されるという事実- 入力内容を取得できません。
base64エンコーディングが必要な場合は、test
次のようになります。
printf test | base64
または
printf %s "$data" | base64
任意のデータの場合。
Base64エンコーディングが提供されていますtest<newline>
。