2016-05-15 5 views
2

私は、cat <<を使用すると、単に<<を使用するよりも好ましいと思っています。私はZSHシェルでテストしてるとcat << EOFの代わりに<< EOFを使用してみませんか?

cat <<EOF 
Hello world! 
EOF 

<<EOF 
Hello world! 
EOF 

の出力します。

var=$(cat <<EOF 
Hello world! 
EOF 
) 

var=$(<<EOF 
Hello world! 
EOF 
) 

ここ-docの2つの形式の間の実用的な違いは何ですか?の同じ変数の値を持ちますか

+0

'shell'の代わりにこの' zsh'をタグ付けすることができます。なぜなら、それはその単一のシェルにしか適用できないからです。 –

+0

はい、それは良いです。私はそれがzsh非常に特定の拡張機能であることを知らなかった。 –

答えて

2

zshのデフォルトの動作(たとえば、zsh -fを呼び出す)では、2つの例の間に相違はありません。トレース出力を確認するには、zsh -x -fという2つの例を呼び出すことができます。catは、後者の場合でも実際に呼び出されます。

これらの相違点はRedirections with no command, zshmisc(1)に記載されていますが、 zshのは、コマンドなしでリダイレクトするために、いくつかの方法で動作しますので、我々は何も壊さないためにそれについて行うことができます:明示的catを使用するには

  • を。
  • localoptions /パラメータを設定します。

コマンドなし

とリダイレクトシンプルなコマンドは、1つのまたは複数のリダイレクト演算子と0個以上のパラメータの割り当てで構成されていますが、コマンド名、zshのは、いくつかの方法で振る舞うことができます。

パラメータNULLCMDが設定されていないか、またはオプションCSH_NULLCMDが設定されていると、エラーが発生します。これはcshの動作で、CSH_NULLCMDはcshをエミュレートするときにデフォルトで設定されます。

オプションSH_NULLCMDが設定されている場合、組み込みの ':'が指定されたリダイレクトを含むコマンドとして挿入されます。これは、shまたはkshをエミュレートするときのデフォルトです。

パラメータNULLCMDが設定されている場合、その値は指定されたリダイレクトのコマンドとして使用されます。 NULLCMDREADNULLCMDの両方が設定されている場合、リダイレクションが入力である場合は、前者の値の代わりに後者の値が使用されます。NULLCMDのデフォルトは「猫」であり、それが端末の場合READNULLCMDのためのページングで、「more'.Thus

<ファイル

で標準出力にファイルの内容を示しています。 NULLCMDおよびREADNULLCMDは、シェル関数を参照することがあります。

- zshのシェルオプションSH_NULLCMDが設定されている場合、後者の場合には、$var等、設定されませんのでRedirections with no command, zshmisc(1)

# I've tested with running `zsh -f` to check the various behaviors. 
test-nullcmd() { 
    local var=$(<<EOF 
Hello world! 
EOF 
) 
    echo "$var" 
} 

test-nullcmd 
#> Hello world! 

() { 
    setopt localoptions shnullcmd 
    test-nullcmd 
} 
# nothing will be printed 

() { 
    setopt localoptions cshnullcmd 
    test-nullcmd 
} 
# test-nullcmd:1: redirection with no command (error) 

() { 
    local NULLCMD= 
    test-nullcmd 
} 
# test-nullcmd:1: redirection with no command (error) 

ところで、私たちはむしろcommand cat使用することができますエイリアスの展開を防ぐためにのみcatよりも優先されます。

+0

素晴らしい答え。文書化され、テストされ、猫のunaliasについての良いアドバイスがあります。どうもありがとうございました! –

1

説明されている動作はzshのみです。 zshでは、これは不必要に外部バイナリ(/bin/cat)を呼び出すよりも大幅にパフォーマンスが向上します。

あなたは、このようなbashのようPOSIXシェル上で、このようなcatなどの外部ツールを起動するオーバーヘッドなしにstdoutにヒアドキュメントの内容を放出したい場合は、代わりに次のようなものが必要だろう:

# read heredoc into $var, terminated by first NUL, w/ truthy exit status 
IFS= read -r -d '' var <<'EOF' ||: 
content goes here 
EOF 

# emit $var to stdout 
printf '%s' "$var" 

POSIXで保証されていないzsh構文は、read; printfアプローチよりもかなり簡潔ですが、catよりもはるかに高速です。

関連する問題