2019年6月22日土曜日

bash のヒアドキュメントは、一時ファイルを作成する

ディスクの空きスペースが無くなった際、手持ちの bash スクリプトから次のようなメッセージが出ていました。
myscript: cannot create temp file for here-document: No space left on device
そのスクリプトではヒアドキュメントを使っており、メッセージから察するに、bash のヒアドキュメントでは、背後で一時ファイルが作られるらしい、と認識しました。考えてみると自然な実装であり「まあそうなるわなあ」という感想。
いちおう確かめるために、そのスクリプトのエッセンスを抽出して実験してみました。
#!/bin/bash
perl <<'PERL'
exit 0
PERL
[root@hoge ~]# uname -a
Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# rpm -q bash
bash-4.2.46-31.el7.x86_64
[root@hoge ~]# diff -c test1 test2
*** test1 2019-06-21 23:38:42.812280355 +0900
--- test2 2019-06-21 23:39:56.797172798 +0900
***************
*** 1,4 ****
  #!/bin/bash
! perl <<'PERL'
  exit 0
! PERL
--- 1,4 ----
  #!/bin/bash
! perl -e '
  exit 0
! '
[root@hoge ~]# strace -o /tmp/strace.out -f ./test1   ※ヒアドキュメントを使用した場合
[root@hoge ~]# strace -o /tmp/strace.out2 -f ./test2
[root@hoge ~]# grep /tmp/ /tmp/strace.out
86704 open("/tmp/sh-thd-1561087024", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3
86704 open("/tmp/sh-thd-1561087024", O_RDONLY) = 4
86704 unlink("/tmp/sh-thd-1561087024")  = 0
[root@hoge ~]# grep /tmp/ /tmp/strace.out2
※ヒアドキュメントを使用しない場合は出力なし
[root@hoge ~]# wc -l /tmp/strace.out*
  402 /tmp/strace.out
  393 /tmp/strace.out2
  795 合計
strace の出力から、bash のヒアドキュメントは、一時ファイルを作成すると確認できました。この例の場合は、ヒアドキュメントをやめて perl -e '...' と書き換えれば、一時ファイル作成を避けることができました。全体のシステムコール数も減りました。
せこいようですが、「塵も積もれば山となる」という場合もあるものと思います。

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ