bashのヒアドキュメントで、root権限下のディレクトリにスクリプトを作成する
以前、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
の標準出力をパイプでつなぎ、sudo
でtee
を実行して、ファイル名を出力先にする。
[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
にリダイレクトしている。