【Linux】ほぼワンライナーで中身の伴ったファイルを作る

著者:杉浦

【Linux】ほぼワンライナーで中身の伴ったファイルを作る

 SSHしてタイミングや画面の状態を考慮せず一行コマンドのスパムだけで環境構築したい時なんかに使えます。エディタを開くのもファイルのアップロードのための権限を得るのも面倒だけどsudoとコマンド送信はできるみたいな時、特に使えます。
 echoの結果をファイルに出力することで実現します。例えば次の様にシェルスクリプトのファイルを作れます。

set +H
echo -e "#!/bin/sh\n/home/pi/RTKLIB/app/str2str/gcc/str2str -in serial://ttyACM0:115200 -out tcpsvr://:12345\n" | sudo tee /opt/str2str_tcp_svr.sh

 以下解説です。
 一行目のset +Hはヒストリ参照の無効化のためのコマンドです。シェルには!hogeの様に打つと最近使ったhogeから使ったコマンドを呼び出す機能があります。面倒なオプションをコピペするよりもサクサク操作できるなど利点がありますが今回は邪魔になりがちです。シェルスクリプトファイルを生成したい時、先頭の#!/bin./shを誤って解釈していしまうので無効化します。setはヒストリ参照以外にも多くのオプションの制御ができます。
 二行目の-eは改行の有効化(\nが改行コードと扱われるようになる)です。これで複数行にわたるファイルの中身を表現します。ファイルをどこかで下書きした後に改行コードを文字列\nに置換すると楽です。
 できあがったファイルの中身をsudo tee [ファイル]で吐き出します。sudoのため権限絡みのファイル生成問題を避けられます。teeは次の通りのコマンドでパイプで渡された標準入力であるechoの中身をファイルに書き込みます。標準出力(画面とか)にも出力されるため書き込み内容も見やすい形で確かめられ安全安心です。

$ tee --help
使用法: tee [オプション]... [ファイル]...
標準入力を各 FILE にコピーし、標準出力にも出力します。

  -a, --append              指定されたファイルに追加し、上書きしない
  -i, --ignore-interrupts   割込みシグナルを無視
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

FILE に - を指定した場合、標準出力に再度コピーします

GNU coreutils online help: 
tee の翻訳に関するバグは  に連絡してください。
完全な文書を参照する場合は info coreutils 'tee invocation' を実行してください。
  • この記事いいね! (1)

著者について

杉浦 administrator