以前、bashのヒアドキュメントを使ったスクリプトの作成で、catを使ったスクリプトの作成方法を紹介した。

[vagrant@localhost ~]$ cat <<EOT > test.sh
> #!/bin/bash
> set -eu
>
> echo test
>
> EOT

[vagrant@localhost ~]$ ls -l test.sh
-rw-rw-r-- 1 vagrant vagrant 34  7月  1 22:30 2015 test.sh

作成先が実行ユーザで書き込みできるディレクトリなら問題ないが、root権限が必要なディレクトリでは

[vagrant@localhost ~]$ cat <<EOT > /usr/local/bin/test.sh
> #!/bin/bash
> set -eu
>
> echo test
>
> EOT
-bash: /usr/local/bin/test.sh: 許可がありません

作成できない。

作成するには、catの標準出力をパイプでつなぎ、sudoteeを実行して、ファイル名を出力先にする。

[vagrant@localhost ~]$ cat <<EOT | sudo tee /usr/local/bin/test.sh > /dev/null
> #!/bin/bash
> set -eu
>
> echo test
>
> EOT
[vagrant@localhost ~]$ ls -l /usr/local/bin
合計 4
-rw-r--r-- 1 root root 34  7月  1 22:40 2015 test.sh

追記するには、tee-aオプションを指定する。

[vagrant@localhost ~]$ cat <<EOT | sudo tee -a /usr/local/bin/test.sh > /dev/null
> echo test2
>
> EOT

[vagrant@localhost ~]$ cat /usr/local/bin/test.sh
#!/bin/bash
set -eu

echo test

echo test2

teeは、標準入力の内容を指定したファイルと標準出力に出力する。

上記の方法では、teeを使って入力内容をファイルに出力しているが、標準出力は必要ないため/dev/nullにリダイレクトしている。

参考

  • shell - sudoとヒアドキュメントでファイルを作成する小技 - Qiita
  • bashのヒアドキュメントを使ったスクリプトの作成 - 作業ノート